openssl/util/check-format-test-negatives.c
2022-01-09 13:19:52 +11:00

780 lines
11 KiB
C

/*
* Copyright 2007-2022 The OpenSSL Project Authors. All Rights Reserved.
* Copyright Siemens AG 2015-2022
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
/*
* A collection of test cases where check-format.pl should not report issues.
* There are some known false positives, though, which are marked below.
*/
#define F \
void f() \
{ \
int i; \
int j; \
\
return; \
}
/*-
* allow extra SPC in format-tagged multi-line comment
*/
int f(void) /*
* trailing multi-line comment
*/
{
typedef int INT;
void v;
short b;
char c;
signed s;
unsigned u;
int i;
long l;
float f;
double d;
enum {} enu;
struct {} stru;
union {} un;
auto a;
extern e;
static int stat;
const int con;
volatile int vola;
register int reg;
/*
* multi-line comment should not disturb detection of local decls
*/
BIO1 ***b;
/* intra-line comment should not disturb detection of local decls */
unsigned k;
/* intra-line comment should not disturb detection of end of local decls */
if (ctx == NULL) { /* non-leading end-of-line comment */
if (/* comment after '(' */ pem_name != NULL /* comment before ')' */)
/* entire-line comment indent usually like for the following line */
return NULL; /* hanging indent also for this line after comment */
/* leading comment has same indentation as normal code */ stmt;
/* entire-line comment may have same indent as normal code */
}
for (;;)
;
for (i = 0;;)
;
for (i = 0; i < 1;)
;
for (;;) ; /* should not trigger: space before ';' */
lab: ; /* should not trigger: space before ';' */
#if X
if (1) /* bad style: just part of control structure depends on #if */
#else
if (2) /*@ resulting false positive */
#endif
c; /*@ resulting false positive */
if (1)
if (2)
c;
else
e;
else
f;
do
do
2;
while (1);
while (2);
if (1)
f(a, b);
do
1; while (2); /*@ more than one stmt just to construct case */
if (1)
f(a, b);
else
do
1;
while (2);
if (1)
f(a, b);
else do /*@ (non-brace) code before 'do' just to construct case */
1;
while (2);
f1234(a,
b); do /*@ (non-brace) code before 'do' just to construct case */
1;
while (2);
if (1)
f(a,
b); do /*@ (non-brace) code before 'do' just to construct case */
1;
while (2);
if (1)
f(a, b);
else
do f(c, c); /*@ (non-brace) code after 'do' just to construct case */
while (2);
if (1)
f(a, b);
else
return;
if (1)
f(a,
b); else /*@ (non-brace) code before 'else' just to construct case */
do
1;
while (2);
if (1)
{ /*@ brace after 'if' not on same line just to construct case */
c;
d;
}
/* this comment is correctly indented if it refers to the following line */
d;
if (1) {
2;
} else /*@ no brace after 'else' just to construct case */
3;
do {
} while (x);
if (1) {
2;
} else {
3;
}
if (4)
5;
else
6;
if (1) {
if (2) {
case MAC_TYPE_MAC:
{
EVP_MAC_CTX *new_mac_ctx;
if (ctx->pkey == NULL)
return 0;
}
break;
default:
/* This should be dead code */
return 0;
}
}
if (expr_line1
== expr_line2
&& expr_line3) {
c1;
} else {
c;
d;
}
if (expr_line1
== expr_line2
&& expr_line3)
hanging_stmt;
}
/* should not trigger: constant on LHS of comparison or assignment operator */
X509 *x509 = NULL;
int y = a + 1 < b;
int ret, was_NULL = *certs == NULL;
/* should not trigger: no space before binary ... operator */
float z = 1e-6 * (-1) * b[+6] * 1e+1 * (a)->f * (long)+1
- (tmstart.tv_sec + tmstart.tv_nsec * 1e-9);
struct st = {-1, 0};
const OPTIONS passwd_options[] = {
{"aixmd5", OPT_AIXMD5, '-', "AIX MD5-based password algorithm"},
#if !defined(OPENSSL_NO_DES) && !defined(OPENSSL_NO_DEPRECATED_3_0)
{"crypt", OPT_CRYPT, '-', "Standard Unix password algorithm (default)"},
#endif
OPT_R_OPTIONS,
{NULL}
};
typedef * d(int)
x;
typedef (int)
x;
typedef (int)*()
x;
typedef *int *
x;
typedef OSSL_CMP_MSG *(*cmp_srv_process_cb_t)
(OSSL_CMP_SRV_CTX *ctx, OSSL_CMP_MSG *msg)
xx;
int f()
{
c;
if (1) {
c;
}
c;
if (1)
if (2)
{ /*@ brace after 'if' not on same line just to construct case */
c;
}
e;
const usign = {
0xDF,
{
dd
},
dd
};
const unsign = {
0xDF, {
dd
},
dd
};
}
const unsigned char trans_id[OSSL_CMP_TRANSACTIONID_LENGTH] = {
0xDF,
};
const unsigned char trans_id[OSSL_CMP_TRANSACTIONID_LENGTH] =
{
0xDF,
};
typedef
int
a;
typedef
struct
{
int a;
} b;
typedef enum {
w = 0
} e_type;
typedef struct {
enum {
w = 0
} e_type;
enum {
w = 0
} e_type;
} e;
struct s_type {
enum e_type {
w = 0
};
};
struct s_type
{
enum e_type {
w = 0
};
enum e2_type {
w = 0
};
};
#define X 1 + 1
#define Y /* .. */ 2 + 2
#define Z 3 + 3 * (*a++)
static varref cmp_vars[] = { /* comment. comment? comment! */
{&opt_config}, {&opt_section},
{&opt_server}, {&opt_proxy}, {&opt_path},
};
#define SWITCH(x) \
switch (x) { \
case 0: \
break; \
default: \
break; \
}
#define DEFINE_SET_GET_BASE_TEST(PREFIX, SETN, GETN, DUP, FIELD, TYPE, ERR, \
DEFAULT, NEW, FREE) \
static int execute_CTX_##SETN##_##GETN##_##FIELD( \
TEST_FIXTURE *fixture) \
{ \
CTX *ctx = fixture->ctx; \
int (*set_fn)(CTX *ctx, TYPE) = \
(int (*)(CTX *ctx, TYPE))PREFIX##_##SETN##_##FIELD; \
/* comment */ \
}
union un var; /* struct/union/enum in variable type */
struct provider_store_st *f() /* struct/union/enum in function return type */
{
}
static void f(struct pem_pass_data *data) /* struct/union/enum in arg list */
{
}
static void *fun(void)
{
if (pem_name != NULL)
/* comment */
return NULL;
label0:
label1: /* allow special indent 1 for label at outermost level in body */
do {
label2:
size_t available_len, data_len;
const char *curr = txt, *next = txt;
char *tmp;
{
label3:
}
} while (1);
char *intraline_string_with_comment_delimiters_and_dbl_space = "1 /*1";
char *multiline_string_with_comment_delimiters_and_dbl_space = "1 /*1\
2222222\'22222222222222222\"222222222" "33333 /*3333333333" "44 /*44444444444\
55555555555555\
6666";
}
ASN1_CHOICE(OSSL_CRMF_POPO) = {
ASN1_IMP(OSSL_CRMF_POPO, value.raVerified, ASN1_NULL, 0),
ASN1_EXP(OSSL_CRMF_POPO, value.keyAgreement, OSSL_CRMF_POPOPRIVKEY, 3)
} ASN1_CHOICE_END(OSSL_CRMF_POPO)
IMPLEMENT_ASN1_FUNCTIONS(OSSL_CRMF_POPO)
ASN1_ADB(OSSL_CRMF_ATTRIBUTETYPEANDVALUE) = {
ADB_ENTRY(NID_id_regCtrl_regToken,
ASN1_SIMPLE(OSSL_CRMF_ATTRIBUTETYPEANDVALUE,
value.regToken, ASN1_UTF8STRING)),
} ASN1_ADB_END(OSSL_CRMF_ATTRIBUTETYPEANDVALUE, 0, type, 0,
&attributetypeandvalue_default_tt, NULL);
ASN1_ITEM_TEMPLATE(OSSL_CRMF_MSGS) =
ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0,
OSSL_CRMF_MSGS, OSSL_CRMF_MSG)
ASN1_ITEM_TEMPLATE_END(OSSL_CRMF_MSGS)
void f_looong_body_200()
{ /* function body length up to 200 lines accepted */
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
}
void f_looong_body_201()
{ /* function body length > 200 lines, but LONG BODY marker present */
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
}