Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b58f414

Browse files
committed
[CPP-340] Add more test case; exclude K&R definitions of functions when looking
up ()-declarations; refactor QL code.
1 parent d76138f commit b58f414

8 files changed

Lines changed: 114 additions & 59 deletions

File tree

cpp/ql/src/Likely Bugs/Underspecified Functions/MistypedFunctionArguments.ql

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@
1414

1515
import cpp
1616

17-
pragma[inline]
18-
predicate pointerArgTypeMayBeUsed(Type arg, Type parm) {
19-
arg = parm
20-
or
21-
// arithmetic types
17+
predicate arithTypesMatch(Type arg, Type parm) {
2218
arg instanceof ArithmeticType and
2319
parm instanceof ArithmeticType and
2420
arg.getSize() = parm.getSize() and
2521
(
26-
arg instanceof IntegralType and
27-
parm instanceof IntegralType
22+
arg instanceof IntegralOrEnumType and
23+
parm instanceof IntegralOrEnumType
2824
or
2925
arg instanceof FloatingPointType and
3026
parm instanceof FloatingPointType
3127
)
28+
}
29+
pragma[inline]
30+
predicate pointerArgTypeMayBeUsed(Type arg, Type parm) {
31+
arg = parm
3232
or
33-
// pointers to void are ok
33+
// arithmetic types
34+
arithTypesMatch(arg, parm)
35+
or
36+
// conversion to/from pointers to void is allowed
3437
arg instanceof VoidType
3538
or
3639
parm instanceof VoidType
@@ -40,23 +43,22 @@ pragma[inline]
4043
predicate argTypeMayBeUsed(Type arg, Type parm) {
4144
arg = parm
4245
or
43-
// float arguments will have been promoted to double,
44-
// and the parameter must match this
45-
arg instanceof DoubleType and
46-
parm instanceof DoubleType
47-
or
48-
// integral arguments are promoted to int (but not long long).
49-
arg instanceof IntegralType and
50-
arg.getSize() = 4 and
51-
parm instanceof IntegralType and
52-
parm.getSize() = 4
46+
// arithmetic types
47+
arithTypesMatch(arg, parm)
5348
or
5449
// pointers to compatible types
5550
pointerArgTypeMayBeUsed(arg.(PointerType).getBaseType().getUnspecifiedType(),
5651
parm.(PointerType).getBaseType().getUnspecifiedType())
5752
or
53+
pointerArgTypeMayBeUsed(arg.(ArrayType).getBaseType().getUnspecifiedType(),
54+
parm.(PointerType).getBaseType().getUnspecifiedType())
55+
or
56+
// C11 arrays
5857
pointerArgTypeMayBeUsed(arg.(PointerType).getBaseType().getUnspecifiedType(),
5958
parm.(ArrayType).getBaseType().getUnspecifiedType())
59+
or
60+
pointerArgTypeMayBeUsed(arg.(ArrayType).getBaseType().getUnspecifiedType(),
61+
parm.(ArrayType).getBaseType().getUnspecifiedType())
6062
}
6163

6264
// This predicate doesn't necessarily have to exist, but if it does exist
@@ -69,24 +71,32 @@ predicate argMayBeUsed(Expr arg, Parameter parm) {
6971
parm.getType().getUnspecifiedType())
7072
}
7173

72-
// True if function was ()-declared, but not (void)-declared
73-
pragma[inline]
74+
// True if function was ()-declared, but not (void)-declared or K&R-defined
7475
predicate hasZeroParamDecl(Function f) {
7576
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
76-
not fde.hasVoidParamList() and fde.getNumberOfParameters() = 0
77+
not fde.hasVoidParamList() and fde.getNumberOfParameters() = 0 and not fde.isDefinition()
78+
)
79+
}
80+
81+
// True if this file (or header) was compiled as a C file
82+
predicate isCompiledAsC(Function f) {
83+
exists(File file | file.compiledAsC() |
84+
file = f.getFile() or file.getAnIncludedFile+() = f.getFile()
7785
)
7886
}
7987

8088
from FunctionCall fc, Function f, Parameter p
8189
where
8290
f = fc.getTarget() and
8391
p = f.getAParameter() and
92+
hasZeroParamDecl(f) and
93+
isCompiledAsC(f) and
8494
not f.isVarargs() and
95+
not f instanceof BuiltInFunction and
8596
p.getIndex() < fc.getNumberOfArguments() and
86-
hasZeroParamDecl(f) and
8797
// Parameter p and its corresponding call argument must have mismatched types
8898
not argMayBeUsed(fc.getArgument(p.getIndex()), p)
89-
select fc, "Calling $@: argument $@ of type $@ is incompatible with parameter $@", f, f.toString(),
99+
select fc, "Calling $@: argument $@ of type $@ is incompatible with parameter $@.", f, f.toString(),
90100
fc.getArgument(p.getIndex()) as arg, arg.toString(),
91-
arg.getFullyConverted().getType().getUnspecifiedType() as atype,
92-
atype.toString(), p, p.getTypedName()
101+
arg.getExplicitlyConverted().getType().getUnspecifiedType() as atype, atype.toString(), p,
102+
p.getTypedName()

cpp/ql/src/Likely Bugs/Underspecified Functions/TooFewArguments.ql

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,30 @@
1515

1616
import cpp
1717

18+
// True if function was ()-declared, but not (void)-declared or K&R-defined
19+
predicate hasZeroParamDecl(Function f) {
20+
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
21+
not fde.hasVoidParamList() and fde.getNumberOfParameters() = 0 and not fde.isDefinition()
22+
)
23+
}
24+
25+
// True if this file (or header) was compiled as a C file
26+
predicate isCompiledAsC(Function f) {
27+
exists(File file | file.compiledAsC() |
28+
file = f.getFile() or file.getAnIncludedFile+() = f.getFile()
29+
)
30+
}
31+
1832
from FunctionCall fc, Function f
1933
where
2034
f = fc.getTarget() and
2135
not f.isVarargs() and
22-
// There must be a zero-parameter declaration (explicit or implicit)
23-
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
24-
fde.getNumberOfParameters() = 0
25-
) and
36+
not f instanceof BuiltInFunction and
37+
hasZeroParamDecl(f) and
38+
isCompiledAsC(f) and
2639
// There is an explicit declaration of the function whose parameter count is larger
2740
// than the number of call arguments
2841
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
29-
not fde.isImplicit() and fde.getNumberOfParameters() > fc.getNumberOfArguments()
42+
fde.getNumberOfParameters() > fc.getNumberOfArguments()
3043
)
3144
select fc, "This call has fewer arguments than required by $@.", f, f.toString()

cpp/ql/src/Likely Bugs/Underspecified Functions/TooManyArguments.ql

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,27 @@
1313

1414
import cpp
1515

16+
// True if function was ()-declared, but not (void)-declared or K&R-defined
17+
predicate hasZeroParamDecl(Function f) {
18+
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
19+
not fde.hasVoidParamList() and fde.getNumberOfParameters() = 0 and not fde.isDefinition()
20+
)
21+
}
22+
23+
// True if this file (or header) was compiled as a C file
24+
predicate isCompiledAsC(Function f) {
25+
exists(File file | file.compiledAsC() |
26+
file = f.getFile() or file.getAnIncludedFile+() = f.getFile()
27+
)
28+
}
29+
1630
from FunctionCall fc, Function f
1731
where
1832
f = fc.getTarget() and
1933
not f.isVarargs() and
20-
// There must be a zero-parameter declaration (explicit or implicit)
21-
exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
22-
fde.getNumberOfParameters() = 0
23-
) and
34+
not f instanceof BuiltInFunction and
35+
hasZeroParamDecl(f) and
36+
isCompiledAsC(f) and
2437
// There must not exist a declaration with the number of parameters
2538
// at least as large as the number of call arguments
2639
not exists(FunctionDeclarationEntry fde | fde = f.getADeclarationEntry() |
Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
| test.c:25:3:25:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:24:3:24:3 | not_yet_declared2 | not_yet_declared2 | test.c:25:21:25:22 | ca | ca | file://:0:0:0:0 | int * | int * | test.c:54:24:54:26 | p#0 | int p#0 |
2-
| test.c:25:3:25:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:54:6:54:22 | not_yet_declared2 | not_yet_declared2 | test.c:25:21:25:22 | ca | ca | file://:0:0:0:0 | int * | int * | test.c:54:24:54:26 | p#0 | int p#0 |
3-
| test.c:32:3:32:29 | call to declared_empty_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:55:6:55:32 | declared_empty_defined_with | declared_empty_defined_with | test.c:32:31:32:32 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:55:38:55:38 | x | int x |
4-
| test.c:36:3:36:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:58:6:58:30 | not_declared_defined_with | not_declared_defined_with | test.c:36:29:36:31 | 4 | 4 | file://:0:0:0:0 | long long | long long | test.c:58:36:58:36 | x | int x |
5-
| test.c:36:3:36:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:58:6:58:30 | not_declared_defined_with | not_declared_defined_with | test.c:36:37:36:42 | 2500000000.0 | 2500000000.0 | file://:0:0:0:0 | double | double | test.c:58:50:58:50 | z | int z |
6-
| test.c:39:3:39:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:39:26:39:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:70:34:70:34 | x | int * x |
7-
| test.c:39:3:39:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:39:34:39:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:70:43:70:43 | y | void * y |
8-
| test.c:39:3:39:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:70:6:70:27 | declared_with_pointers | declared_with_pointers | test.c:39:26:39:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:70:34:70:34 | x | int * x |
9-
| test.c:39:3:39:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:70:6:70:27 | declared_with_pointers | declared_with_pointers | test.c:39:34:39:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:70:43:70:43 | y | void * y |
10-
| test.c:41:3:41:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:6:6:6:24 | declared_with_array | declared_with_array | test.c:41:23:41:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:71:31:71:31 | a | char[6] a |
11-
| test.c:41:3:41:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:71:6:71:24 | declared_with_array | declared_with_array | test.c:41:23:41:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:71:31:71:31 | a | char[6] a |
12-
| test.c:43:3:43:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:73:7:73:24 | defined_with_float | defined_with_float | test.c:43:22:43:24 | 2.0 | 2.0 | file://:0:0:0:0 | double | double | test.c:73:32:73:32 | f | float f |
13-
| test.c:44:3:44:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:73:7:73:24 | defined_with_float | defined_with_float | test.c:44:22:44:24 | 2.0 | 2.0 | file://:0:0:0:0 | double | double | test.c:73:32:73:32 | f | float f |
14-
| test.c:47:3:47:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:77:8:77:26 | defined_with_double | defined_with_double | test.c:47:23:47:25 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:77:35:77:35 | d | double d |
15-
| test.c:49:3:49:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:81:11:81:32 | defined_with_long_long | defined_with_long_long | test.c:49:26:49:28 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:81:44:81:45 | ll | long long ll |
16-
| test.c:50:3:50:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@ | test.c:81:11:81:32 | defined_with_long_long | defined_with_long_long | test.c:50:26:50:26 | 3 | 3 | file://:0:0:0:0 | int | int | test.c:81:44:81:45 | ll | long long ll |
1+
| test.c:32:3:32:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:31:3:31:3 | not_yet_declared2 | not_yet_declared2 | test.c:32:21:32:22 | ca | ca | file://:0:0:0:0 | int * | int * | test.c:66:24:66:26 | p#0 | int p#0 |
2+
| test.c:32:3:32:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:31:3:31:3 | not_yet_declared2 | not_yet_declared2 | test.c:32:21:32:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:66:24:66:26 | p#0 | int p#0 |
3+
| test.c:32:3:32:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:66:6:66:22 | not_yet_declared2 | not_yet_declared2 | test.c:32:21:32:22 | ca | ca | file://:0:0:0:0 | int * | int * | test.c:66:24:66:26 | p#0 | int p#0 |
4+
| test.c:32:3:32:19 | call to not_yet_declared2 | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:66:6:66:22 | not_yet_declared2 | not_yet_declared2 | test.c:32:21:32:22 | ca | ca | file://:0:0:0:0 | int[4] | int[4] | test.c:66:24:66:26 | p#0 | int p#0 |
5+
| test.c:39:3:39:29 | call to declared_empty_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:67:6:67:32 | declared_empty_defined_with | declared_empty_defined_with | test.c:39:31:39:32 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:67:38:67:38 | x | int x |
6+
| test.c:43:3:43:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:70:6:70:30 | not_declared_defined_with | not_declared_defined_with | test.c:43:29:43:31 | 4 | 4 | file://:0:0:0:0 | long long | long long | test.c:70:36:70:36 | x | int x |
7+
| test.c:43:3:43:27 | call to not_declared_defined_with | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:70:6:70:30 | not_declared_defined_with | not_declared_defined_with | test.c:43:37:43:42 | 2500000000.0 | 2500000000.0 | file://:0:0:0:0 | float | float | test.c:70:50:70:50 | z | int z |
8+
| test.c:46:3:46:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:46:26:46:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:82:34:82:34 | x | int * x |
9+
| test.c:46:3:46:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:5:6:5:27 | declared_with_pointers | declared_with_pointers | test.c:46:34:46:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:82:43:82:43 | y | void * y |
10+
| test.c:46:3:46:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:82:6:82:27 | declared_with_pointers | declared_with_pointers | test.c:46:26:46:31 | 3500000000000000.0 | 3500000000000000.0 | file://:0:0:0:0 | double | double | test.c:82:34:82:34 | x | int * x |
11+
| test.c:46:3:46:24 | call to declared_with_pointers | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:82:6:82:27 | declared_with_pointers | declared_with_pointers | test.c:46:34:46:34 | 0 | 0 | file://:0:0:0:0 | int | int | test.c:82:43:82:43 | y | void * y |
12+
| test.c:48:3:48:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:6:6:6:24 | declared_with_array | declared_with_array | test.c:48:23:48:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:83:31:83:31 | a | char[6] a |
13+
| test.c:48:3:48:21 | call to declared_with_array | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:83:6:83:24 | declared_with_array | declared_with_array | test.c:48:23:48:24 | & ... | & ... | file://:0:0:0:0 | int * | int * | test.c:83:31:83:31 | a | char[6] a |
14+
| test.c:50:3:50:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:85:7:85:24 | defined_with_float | defined_with_float | test.c:50:22:50:24 | 2.0 | 2.0 | file://:0:0:0:0 | float | float | test.c:85:32:85:32 | f | float f |
15+
| test.c:51:3:51:20 | call to defined_with_float | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:85:7:85:24 | defined_with_float | defined_with_float | test.c:51:22:51:24 | 2.0 | 2.0 | file://:0:0:0:0 | double | double | test.c:85:32:85:32 | f | float f |
16+
| test.c:54:3:54:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:89:8:89:26 | defined_with_double | defined_with_double | test.c:54:23:54:25 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:89:35:89:35 | d | double d |
17+
| test.c:56:3:56:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:11:93:32 | defined_with_long_long | defined_with_long_long | test.c:56:26:56:28 | 99 | 99 | file://:0:0:0:0 | int | int | test.c:93:44:93:45 | ll | long long ll |
18+
| test.c:57:3:57:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:11:93:32 | defined_with_long_long | defined_with_long_long | test.c:57:26:57:26 | 3 | 3 | file://:0:0:0:0 | int | int | test.c:93:44:93:45 | ll | long long ll |
19+
| test.c:59:3:59:21 | call to defined_with_double | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:89:8:89:26 | defined_with_double | defined_with_double | test.c:59:23:59:25 | 2 | 2 | file://:0:0:0:0 | long long | long long | test.c:89:35:89:35 | d | double d |
20+
| test.c:60:3:60:24 | call to defined_with_long_long | Calling $@: argument $@ of type $@ is incompatible with parameter $@. | test.c:93:11:93:32 | defined_with_long_long | defined_with_long_long | test.c:60:26:60:31 | 2.499999999999999983e+50 | 2.499999999999999983e+50 | file://:0:0:0:0 | double | double | test.c:93:44:93:45 | ll | long long ll |
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
| test.c:26:3:26:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:24:3:24:3 | not_yet_declared2 | not_yet_declared2 |
2-
| test.c:26:3:26:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:54:6:54:22 | not_yet_declared2 | not_yet_declared2 |
3-
| test.c:28:3:28:29 | call to declared_empty_defined_with | This call has fewer arguments than required by $@. | test.c:55:6:55:32 | declared_empty_defined_with | declared_empty_defined_with |
4-
| test.c:65:10:65:20 | call to dereference | This call has fewer arguments than required by $@. | test.c:68:5:68:15 | dereference | dereference |
1+
| test.c:33:3:33:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:31:3:31:3 | not_yet_declared2 | not_yet_declared2 |
2+
| test.c:33:3:33:19 | call to not_yet_declared2 | This call has fewer arguments than required by $@. | test.c:66:6:66:22 | not_yet_declared2 | not_yet_declared2 |
3+
| test.c:35:3:35:29 | call to declared_empty_defined_with | This call has fewer arguments than required by $@. | test.c:67:6:67:32 | declared_empty_defined_with | declared_empty_defined_with |
4+
| test.c:77:10:77:20 | call to dereference | This call has fewer arguments than required by $@. | test.c:80:5:80:15 | dereference | dereference |
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
| test.c:16:3:16:16 | call to declared_empty | This call has more arguments than required by $@. | test.c:1:6:1:19 | declared_empty | declared_empty |
2-
| test.c:21:3:21:12 | call to undeclared | This call has more arguments than required by $@. | test.c:20:3:20:3 | undeclared | undeclared |
3-
| test.c:23:3:23:19 | call to not_yet_declared1 | This call has more arguments than required by $@. | test.c:23:3:23:3 | not_yet_declared1 | not_yet_declared1 |
4-
| test.c:23:3:23:19 | call to not_yet_declared1 | This call has more arguments than required by $@. | test.c:53:6:53:22 | not_yet_declared1 | not_yet_declared1 |
5-
| test.c:33:3:33:29 | call to declared_empty_defined_with | This call has more arguments than required by $@. | test.c:55:6:55:32 | declared_empty_defined_with | declared_empty_defined_with |
1+
| test.c:23:3:23:16 | call to declared_empty | This call has more arguments than required by $@. | test.c:1:6:1:19 | declared_empty | declared_empty |
2+
| test.c:28:3:28:12 | call to undeclared | This call has more arguments than required by $@. | test.c:27:3:27:3 | undeclared | undeclared |
3+
| test.c:30:3:30:19 | call to not_yet_declared1 | This call has more arguments than required by $@. | test.c:30:3:30:3 | not_yet_declared1 | not_yet_declared1 |
4+
| test.c:30:3:30:19 | call to not_yet_declared1 | This call has more arguments than required by $@. | test.c:65:6:65:22 | not_yet_declared1 | not_yet_declared1 |
5+
| test.c:40:3:40:29 | call to declared_empty_defined_with | This call has more arguments than required by $@. | test.c:67:6:67:32 | declared_empty_defined_with | declared_empty_defined_with |

0 commit comments

Comments
 (0)