HP Code Advisor Diagnostics HP Part Number: 5969-7091 Published: December 2009 Edition: 3
© Copyright 2009 Hewlett-Packard Development Company, L.P. Confidential computer software. Valid license from HP required for possession, use or copying. Consistent with FAR 12.211 and 12.212, Commercial Computer Software, Computer Software Documentation, and Technical Data for Commercial Items are licensed to the U.S. Government under vendor's standard commercial license. The information contained herein is subject to change without notice.
Table of Contents About This Document.........................................................................................................9 Intended Audience.................................................................................................................................9 HP Encourages Your Comments............................................................................................................9 1 Diagnostics Categorization......................................................
2192 unrecognized character escape sequence.....................................................................................36 2193 zero used for undefined preprocessing identifier........................................................................36 2223 function %sq declared implicitly..................................................................................................37 2224 the format string requires additional arguments...............................................................
2991 extra braces are nonstandard........................................................................................................51 3000 a storage class may not be specified here.....................................................................................52 3051 standard requires that %n be given a type by a subsequent declaration (\"int\" assumed).......52 3055 types cannot be declared in anonymous unions..........................................................................
4290 endian porting: the initialization of char array may be endian dependent.................................67 4292 endian porting: the dereference of cast pointer may be endian dependent................................67 4295 abstract function type declared with empty parentheses, consider replacing with parameter list or void. ...........................................................................................................................................
List of Tables 1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9 1-10 Default diagnostics........................................................................................................................11 +wall diagnostics...........................................................................................................................19 +wlint diagnostics..........................................................................................................................19 +w64bit diagnostics........
About This Document This document provides a brief description for a partial list of diagnostics emitted by Cadvise. There are four sections for each description as mentioned below: • The Cause section • The Example section Provides relevant sample code segments that result in the specific diagnostic.
1 Diagnostics Categorization This chapter addresses the diagnostics categorization for HP Code Advisor. NOTE: • Some of the diagnostic numbers given below do not have a corresponding diagnostic description. Incase you need a diagnostic description for a diagnostic number, please send an email to: cadvise-help@lists.hp.com • The diagnostics with number greater than 20000 are more effective when cross-file analysis is enabled. For more information on cross-file analysis, see HP Code Advisor User's Guide.
Table 1-1 Default diagnostics (continued) 12 Diagnostic number Diagnostic message 2149 a global-scope declaration may not have this storage class 2155 old-fashioned assignment operator 2157 expression must be an integral constant expression 2161 unrecognized #pragma 2165 too few arguments in function call 2167 argument of type %t1 is incompatible with parameter of type %t2 2174 expression has no effect 2175 subscript out of range 2178 \"&\" applied to an array has no effect 2181 argum
Table 1-1 Default diagnostics (continued) Diagnostic number Diagnostic message 2460 declaration of %sq hides function parameter 2472 member function typedef (allowed for cfront compatibility) 2490 %n cannot be instantiated -- it has been explicitly specialized 2495 global %n1 used instead of %n2 (cfront compatibility) 2497 declaration of %sq hides template parameter 2514 pointless comparison of unsigned integer with a negative constant 2524 non-const function called for const object (anachron
Table 1-1 Default diagnostics (continued) 14 Diagnostic number Diagnostic message 2836 returning reference to local variable 2855 return type is not identical to return type %t of overridden virtual function %n 2867 declaration of \"size_t\" does not match the expected type %t 2902 type qualifier ignored 2925 type qualifiers on function types are ignored 2959 declared size for bit field is larger than the size of the bit field type; ; truncated to %s bits 2991 extra braces are nonstandard
Table 1-1 Default diagnostics (continued) Diagnostic number Diagnostic message 3197 the prototype declaration of %nfd is ignored after this unprototyped redeclaration 3202 call of zero constant ignored 3210 declaration of %sq hides handler parameter 3211 nonstandard cast to array type ignored 3213 field uses tail padding of a base class 3214 GNU C++ compilers may use bit field padding 3215 %nd was declared \"deprecated\" 3217 unrecognized format function type %sq ignored 3218 base class %
Table 1-1 Default diagnostics (continued) 16 Diagnostic number Diagnostic message 3346 function returns incomplete class type %t 3347 %n has already been initialized; the out-of-class initializer will be ignored 3359 variable attributes appearing after a parenthesized initializer are ignored 3360 the result of this cast cannot be used as an lvalue 3361 negation of an unsigned fixed-point value 3377 friend specifier is not allowed in a class definition; friend specifier is ignored 3386 stora
Table 1-1 Default diagnostics (continued) Diagnostic number Diagnostic message 3627 attribute \"cleanup\" requires automatic storage duration 3628 attribute \"cleanup\" does not apply to parameters 3644 definition at end of file not followed by a semicolon or a declarator 3647 extra arguments ignored 3650 result of call is not used 3651 attribute is ignored for void return type 3652 attribute requires pointer-to-function type 3653 dllimport/dllexport is ignored on redeclaration using a qual
Table 1-1 Default diagnostics (continued) Diagnostic number 18 Diagnostic message 4162 This feature, within an OpenMP directive region, is not supported by this version of C++. All surrounding OpenMP processing pragmas are being ignored.
Table 1-1 Default diagnostics (continued) Diagnostic number Diagnostic message 4288 Object %sq in pragma noptrs_to_globals may not have its address taken, pragma ignored 4294 the use of pragma %s is not allowed in this environment 4301 expression has no effect 4308 case label constant out of range (%s) for switch expression 4313 no prototype or definition in scope for call to memory allocation routine %sq 4321 One or more source files were inaccessible (error: %s) while emitting the source cont
Table 1-3 +wlint diagnostics (continued) 20 Diagnostic number Diagnostic message 2550 %n was set but never used 2767 conversion from pointer to smaller integer 2108 signed bit field of length 1 2815 type qualifier on return type is meaningless 2940 missing return statement at end of non-void 3051 standard requires that %n be given a type by a subsequent declaration ("int" assumed) 3053 conversion from integer to smaller pointer 3348 declaration hides %nd 4324 declaration hides %nd 3373
Table 1-3 +wlint diagnostics (continued) Diagnostic number Diagnostic message 4357 octal escape sequence "%s" is followed by decimal character '%s2' 20200 Potential null pointer dereference %s%s is detected %s 20201 Memory leak is detected 20202 Allocated memory may potentially be leaked %s 20203 Potential out of scope use of local %s %s 20204 Potential out of scope use of alloca return address %s %s 20205 Pointer is used after free 20206 Out of bound access (%s) 20207 Possible out of bou
Table 1-4 +w64bit diagnostics (continued) Diagnostic number Diagnostic message 4230 64 bit migration: conversion from %t1 to %t2 may cause target of pointers to have a different size. 4231 64 bit migration: conversion between types of different sizes has occurred (from %t1 to %t2 ) 4249 64 bit migration: value could be truncated before cast to bigger sized type.
Table 1-6 +wsecurity diagnostics (continued) Diagnostic number Diagnostic message 20132 (SECURITY) %%s is used in the format string for input, potential buffer overflow may occur in %s argument 20212 (SECURITY) Improper creation of temporary file using 'fopen' can lead to race condition. Use 'open' with O_CREAT|O_EXCL flag instead +wlock Diagnostics Following table lists diagnostic messages that cadvise emits when you use the +wlock command line option.
Table 1-8 +wperfadvice diagnostics (continued) Diagnostic number Diagnostic message 20311 performance advice: Loop iterated %s times during %s%% of total invocations. Multi-versioning the loop with the constant iteration count could enable a dditional optimizations. If this loop is one of the inner loops of a loop nest, consider multi-versioning it along with the enclosing loops. 20312 performance advice: Parallelizing this loop will likely provide better performance.
Table 1-9 +w/+w1 diagnostics (continued) Diagnostic number Diagnostic message 3348 declaration hides %nd 3353 %n has no corresponding member operator delete%s (to be called if an exception is thrown during initialization of an allocated object) 4049 vtable generation for classes with no key functions already %s, pragma ignored 4080 explicit request to instantiate %n ignored because of directive %p 4161 OpenMP directives are not active in this compilation because the +Oopenmp option was not specif
Table 1-10 Diagnostic messages that are turned off by default 26 Diagnostic number Diagnostic message 4246 ignoring return value of %n 4325 64 bit migration: struct %sq (recursively) contains a long or pointer field, its size will change based on the data model 4363 possible mismatch in parameters passed to %n, previously seen %p 4360 size of types of consecutive bitfields are different, bitfield packing behavior may be different across compiler 4361 64 bit migration: size of types of consecuti
2 Diagnostics Details This chapter provides the detailed description for a subset of diagnostics emitted by HP Code Advisor. 2009 nested comment is not allowed Cause: Opening comment delimiter, /*, found inside delimited comment. A previous comment may be missing its closing delimiter. C comments delimited by /* */ do not nest.
Action: Use valid/compatible operand types or use a cast operator to convert one operand type to the other type. Reference: 2047 incompatible redefinition of macro %nod Cause: A #define preprocessing directive has redefined a macro whose previous definition contained an error or warning. Normally, the compiler will issue a warning if a macro is redefined to something other than the previous definition.
Reference: 2064 declaration does not declare anything Cause: The declaration does not declare anything. The C standard requires that a declaration must declare at least a tag, an enumeration constant or a declarator. Example: int; Action: Correct or remove the declaration. Reference: C99 6.7.2, ANSI/ISO C++ 6.7(2) 2068 integer conversion resulted in a change of sign Cause: Conversion of integer resulted in sign change.
Not a conversion function, constructor, or destructor, therefore something where a type specifier is expected. Example: struct X { i; }; Action: Provide a declaration specifier. Reference: C99 6.7.2 2082 storage class is not first Cause: The placement of a storage-class specifier other than at the beginning of the declaration specifier in a declaration is an obsolescent feature. Example: int static i = 0; Action: Place the storage-class specifier first in the declaration. Reference: C99 6.7, 6.7.
Declare the 1-bit bit field as unsigned. Reference: 2111 statement is unreachable Cause: Code at this location will never be executed. Often unreachable statements represent a real coding error such as a wrongly inserted return, goto, throw or call to non-returning functions etc. Example: return 0; i++; // warning 2111 here Action: Check for incorrectly placed unconditional control transfer statements.
return 0; for(int a = 0; a < 3; a++) { if (a == 1) return 1; } } Action: If the loop is necessary, change the code such that the loop can be reached. Otherwise, remove the loop. Reference: 2144 a value of type %t1 cannot be used to initialize an entity of type %t2 Cause: Initializing an entity of some type with incompatible types. Example: typedef char* addr; int main() { addr data = "0x1"; int bar = data; return 0; } Action: Initialize an entity of some type with the same type or compatible types.
typedef char* caddr; int main() { caddr data = "0x1"; if (data == DT) return 1; } Action: Avoid such incompatible type conversions. Reference: C99 6.3.2.3 2167 argument of type %t1 is incompatible with parameter of type %t2 Cause: The parameter type passed is incompatible with the function argument type. Example: typedef char * addr; int foo(int a) { return a; } int main() { addr data = "0x1"; foo(data); return 0; } Action: Pass the parameter type that is compatible with the function argument type.
2174 expression has no effect Cause: The compiler detected that the expression has no effect. Example: int main() { int index = 0; for(index; index < 10; index++){ } } Action: Modify the expression so that it has some effect or just remove it. 2175 subscript out of range Cause: The compiler has detected an array access that is outside the bounds of the array. The array access might cause unpredictable behavior.
Action: Ensure that the types of the argument passed matches with the types of formal parameters of the function. Reference: 2181 argument is incompatible with corresponding format string conversion Cause: The compiler has detected a format specifier whose data type does not match its corresponding argument. Example: printf("%d", 2.0); Action: Modify either the argument or the conversion specifier so that they match. Reference:C99 6.2.2.
This warning is issued when mixing different enums or non-enums with enums. Example: enum Bool { FALSE = 0, TRUE = 1}; enum Bool b = FALSE + 1; Action: Make sure that you do not mix enums and non-enums. Reference: 2191 type qualifier is meaningless on cast type Cause: Casting to a qualified type, though valid, is pointless. This is reported only when the cv-qualifiers are explicit in the cast,not, for example, when they are hidden in a typedef or template parameter type.
2223 function %sq declared implicitly Cause: An expression contained a reference to a function that has not been declared. The C99 standard requires that all referenced functions must be declared before they are referenced. Example: int main() { foo(10); } Action: Declare the function before it is referenced. Reference: C99 6.5.2.
Accepting an enumerator list that contains a trailing comma is an extension of HP C provided for compatibility with other C compilers. An enumerator list with a trailing comma is not valid in C89, nor in C++.The C99 standard does permit this syntax. Example: typedef enum Switch { on, off, } var; Action: Remove the trailing comma. Reference: C99 6.7.2.2 ANSI/ISO C++ 7.2 2231 declaration is not visible outside of function Cause: A type is declared within a function prototype.
case 20: printf("twenty\n"); break; default: printf("error\n"); } } } Action: Check if it is a programming error. Reference: 2245 a nonstatic member reference must be relative to a specific object Cause: Only static members can be accessed using the class name. For accessing non-static members, specific object must be used. Example: struct Dummy { int i; }; Dummy::i = 10; } Action: Access non-static members through objects only. For example: Dummy d; d.
2250 reference to void is not allowed Cause: Reference to void is incorrect and is not allowed. Example:void & foo() } { } Action: Remove the & and make it a plain void type. For example: void foo() {} Reference: ANSI/ISO C++ 8.3.2 (4) 2251 array of reference is not allowed Cause: Array of reference is incorrect and is not allowed. Example:int & iarr[5]; } Action: Remove the & and make it a plain array. For example: int iarr[5]; Reference: ANSI/ISO C++ 8.3.
The same base class name is specified more than once in the base class list. A base class name should appear only once in a base class list. Example: class Base {}; class Derived: public Base, protected Base {}; Action: Remove the redundant base class name, for example: class Derived: public Base {}; Reference: 2265 %nd is inaccessible Cause: An attempt is made to access a private or protected member in the context where the member is not accessible. Example: class A { private: int x; } c; c.
Check if you actually want to convert from the derived to base type. If yes, then provide an explicit cast: Base *b = (Base*) new Derived; Reference: ANSI/ISO C++ 8.3.2 (4) 2276 name followed by :: must be a class or namespace name Cause: The qualifier type preceding :: is not declared or defined as a class or a namespace. Example: T::type i; Action: Make sure that the declaration or definition of the class or the namespace is defined before it is used.
}; Action: Make the member function either static or virtual, for example: virtual void vfoo() {} Reference: 2315 the object has cv-qualifiers that are not compatible with the member function Cause: The cv qualifiers ( const and volatile qualifiers) of the object should be compatible with the cv qualifiers of member functions that it calls. For example, any attempt to call a non-const member function on a const object will result in an error. Example: int main() { struct X { void foo(); }; const X s; s.
virtual int foo() = 1; }; Action: Provide the pure specifier only as "= 0", for example: virtual int foo() = 0; Reference: ANSI/ISO C++ 9.2, 10.4(2) 2321 data member initializer is not allowed Cause: Only static const members of integral or enumeration type can be initialized inline in a class definition. For other types, provide the initialization outside the class definition.
Derived bar(); }; Action: Do not declare a function to accept as paramater or return an abstract class type. Reference: ANSI/ISO C++ 10.4(3) 2325 inline specifier allowed on function declarations only Cause: The inline keyword is meaningful for function declarations only. Example: inline int i; Action: Remove the inline keyword. For example: int i; Reference: ANSI/ISO C++ 10.
References should be initialized to refer to a valid object or a function. In certain contexts, when rvalues are used for initializing references, the compiler might create a temporary and bind that to the reference. In such scenarios compiler will issue this diagnostic. Example: struct Init { const int & mem; Init() : mem(10) {} }; Action: Provide a proper object for initializing the reference. Reference: ANSI/ISO C++ 8.5.3 12.
2365 anonymous union at global or namespace scope must be declared static Cause: Anonynous unions at global or namespace scope should be qualified with static qualifier to limit them to file scope. Example: union { int i; }; Action: Add static storage class to the anonymous union declared at global or namespace scope. For example: static union { int i; }; Reference: ANSI/ISO C++ 9.5(3) 2375 declaration requires a typedef name Cause: In a typedef declaration, the typedef name is missing.
}; template class X; Action: Providing explicit instantiations for templates is a old programming style and it is not recommended. Check if you really need to do explicit instantiations in your code. Reference: ANSI/ISO C++ 14.7.2 2513 a value of type %t1 cannot be assigned to an entity of type %t2 Cause: The types of variables used in the assignment are incompatible. Example: long double d = 0.0; char *c = 0; c = Action: Check if the assignment is required and if it is valid.
Provide the variable with a value before the variable is used. If you only provide a value for the use reported here, you may find that when you recompile your program another uninitialized use is detected. It is best to initialize variables as close as possible to the point of declaration. Reference: 2550 %n was set but never used Cause: This identifier is set but never referenced in the current translation unit.
2815 type qualifier on return type is meaningless Cause: A type qualifier has been used as part of a funtion's return type. The type qualifiers have no meaning for function return values. Example: const int foo() { return 10; } Action: Remove the type qualifier in the return type of the function. Reference: 2826 %n was never referenced Cause: This function definition contains a parameter n that was never referenced.
Action: Do not return reference to a local variable; if you really want to return a reference, make the local variable static. This is because the lifetime of a static variable is same as lifetime of the program. Reference: 2837 omission of explicit type is nonstandard ("int" assumed) Cause: A declaration or a definition does not have an explicit type, int will be assumed as the type but this behavior is non-standard.
Example:int arr [4] = { { 0 } }; Action: Remove extra braces. Reference: 3000 a storage class may not be specified here Cause: A storage class can only be specified for an object or a function. Example:static enum nothing { nil = 0 }; Action: Remove the unnecessary storage class specifier. Reference: ARM 7.1.1. 3051 standard requires that %n be given a type by a subsequent declaration (\"int\" assumed) Cause: The parameter of an old-style function definition was not declared.
The return value of the function is the address of a local variable. Unless declared as static, a local variable has automatic storage duration i.e. the storage for it lasts until the block that defines it exists. Dereferencing the pointer to a local variable after the function that defines it returns will lead to undefined runtime behavior. Example: int* foo() { int i = 10; return } Action: If you need to return the pointer to this variable then make it a static variable. Reference: ANSI/ISO C++ 3.7.
int print(char *str,void *fmt, ...) __attribute__((format(printf,2,3))); // argument 2 must be of // string type Action: Where possible use the promoted type instead Reference: ANSI/ISO C++ 5.2.2(7) 3197 the prototype declaration of %nfd is ignored after this unprototyped redeclaration Cause: The unprototyped declaration of a function in an inner scope hides an prototyped declaration in the outer scope. NOTE: In same scope the function prototypes do not hide each other but in nested scope they do.
3348 declaration hides %nd Cause: A declaration hides another variable with the same name visible in this scope. Example: struct X { X(int i) { i = i; } int i; }; Action: Examine your code to see if any of the two declarations should be removed/modified.
C allows conversion between pointers to interchangeable types, but this can be unsafe. Mismatch between character pointer types is diagnosed with a unique message so it can be suppressed if desired. Example: int foo(char *x, unsigned char *y) { x = y; // warning 4212 here } Action: If this conversion is safe for your code, then suppress this warning by providing an explicit cast. Reference: C99 6.3.2.
The compiler has detected conversion of pointers from a lesser aligned type to a more strictly aligned type. This usually happens when assigning an int pointer to a long pointer. This is not a problem in 32 bit mode since int and long are both 4 bytes aligned but in 64 bit mode int is 4 byte aligned whereas long is 8 bytes aligned. Because of the difference in alignment in 64 bit mode this conversion might cause unaligned access in 64 bit mode.
4231 64 bit migration: conversion between types of different sizes has occurred (from %t1 to %t2 ) Cause: The compiler has detected conversion between data types having different sizes. This usually happens when converting from int data type to pointer or long data type and vice versa. This is not a problem in 32 bit mode since int, long and pointer all are of same size (32 bit) but in 64 bit mode int is 32 bit whereas long and pointer are 64 bit.
4237 type cast from %t1 to %t2 may cause sign extension to a larger size integer. Cause: A signed integer constant is being converted to a larger unsigned integral type. The conversion might cause sign # extension leading to a larger value than expected. Example: typedef unsigned long long uint64_t; int i = -1; uint64_t a = (uint64_t) i; Action: Verify if the type cast behavior is intended.
Prototypes are optional in ANSI C, however their use can prevent a wide range of common programming errors which are otherwise difficult to detect. This call site provides no prior prototype or definition so the compiler cannot verify the correctness of the argument list. Example: int main() { foo(10.0f); } Action: Provide a prototype declaration for the function before calling that function.
Two calls to an unprototyped function differ in the number of arguments being passed, at least one of these calls is passing wrong arguments. Example: int main() { foo(10); foo(10, 100); } Action: Correct the function call which is passing wrong number of arguments. Preferably declare the function before calling it. Reference: 4248 comparison of unsigned integer with a signed integer Cause: This occurs due to mixing signed and unsigned operands with relational operators <, ≤, >, ≥.
struct A { unsigned int f1 : 1; }; int main() { A obj; obj.f1 = 30; } Action: Ensure that the assigned value is within the range of the values that the bit-field can store. Reference: 4253 unsigned value cannot be less than zero Cause: An ordered comparison between an unsigned value and a constant that is less than or equal to zero often indicates a programming error. A negative value is converted to an unsigned value before the comparison, so any negative value compares larger than most unsigned values.
4259 suggest parentheses around the operands of %sq Cause: A possibly incorrect combination of [in]equality and bitwise operations. Passing a boolean argument to a bit operation is quite unusual and usually happens because of programming errors like missing parentheses around operands of "&" and "|" Example: return (i == j | k); // warning 4259 here == has higher precedence than | and hence will be evaluated first, this is probably not what the programmer intended.
Reference: 4273 floating-point equality and inequality comparisons may be inappropriate due to round off common in floating-point computation Cause: Since floating point numbers are usually subject to rounding-off errors, comparison between non-constant floating point values may not always be accurate. Example: bool check(float v1, float v2) { return ( v1 == v2 ); } Action: Change your program logic to not depend on such comparisons.
The greater than or less than relational operation in the expression always evaluates to false. This happens when comparing against the largest and smallest values in the range of given type. Example: void foo(unsigned char c) { if (c > 255) {} // warning 4276 here } NOTE: 255 is the largest value for an unsigned char so a > comparison will always be false. Action: Check the value of the constant being used in the operation.
produce the modified value without an intervening sequence point. The final value of such expressions is undefined. Example: i = i++; // warning 4279 here x = i + ++i; // warning 4279 here i = i + 1; // no warning here Action: Rewrite the expression so that each variable is modified only once before a sequence point OR if a variable is modified, it is fetched only to compute the value to be stored in the variable (ex i = i+1). Reference: C99 6.5, ANSI/ISO C++ 5.
on endianness, and a character member, which does not depend on endianness, and the value of the union is stored using one member and accessed using the other. Example: union Endian { char c[4]; int v; }; // warning 4289 here int foo() { union Endian u = { 0x11, 0x22, 0x33, 0x44 }; int i = u.v; return i; } // On a big endian machine value of i will be 0x11223344 whereas // on a little endian machine it will be 0x44332211 Action: For portable code change the way this union is used.
The declaration of function has an empty parameter list. If the function has parameters, they should be declared here; if it has no parameters,void should be specified in the parameter list. Example: void foo(long (*compar) ()) ; Action: The recommended way to declare a function that takes no parameters is to use void in the parameter list.
int a = ALPHA << COUNT; } Action: Correct the constant expression so that it does not overflow. Reference: 4301 expression has no effect Cause: The expression has no effect or side-effect. Example: #define foo(A) 0 int main() { int A = 0; foo(A); } Action: Remove or correct the expression. In some cases the expression might be the result of a valid macro expansion, in such scenarios you can suppress this warning for the particular macro using the +Wmacro option.
Action: Use of '==' to compare 2 strings is unusual and might be done by mistake - check if you should be using strcmp() instead. Reference: 4355 the initializer for %n is greater than %s Cause: This warning is issued when a large sized array (greater than 32 MB) is getting initialized in the program. enum try_stuff {try_array= 0x08000000}; char try[try_array*4] = {1,2,[try_array*4-1]=10 }; Action: It is safe to create an array of size less than 32 MB.
4360 size of types of consecutive bitfields are different, bitfield packing behavior may be different across compiler Cause: This warning is issued during bitfield packing when the types in the structure are different. Example: #include struct node1 { bool b1:1; short s:1; bool b:1; }head1; int main() { printf ("sizeof struct node1 is : %lu\n", sizeof(head1)); return 0; } Action: It is good to use similar types for bitfield packing.
parameters being passed in the call. This warning is issued when there is a mismatch in the parameter types between different call. Example: File 1.c int main() { int i, j; i = ggg(10); j = ggg(10.3); } File 2.c int ggg(long a) { return 0; } Action: Add prototypes for all external functions that is called in the file. Reference: 4364 endian porting: type cast is endian dependent Cause: This warning is issued for pointer casts that are endian dependent. Example: #include
} Action: Initialize the reported variable with a value before it's use. This may not be the only use of the uninitialized value. So it is best to initialize variables as close as possible to the point of declaration. Reference: 20036 variable %s (field %s) is used before its value is set Cause: The compiler has detected use of a member of a struct variable before it's value is set. Example: struct foo { int a; int b; }; int func() { struct foo x; x.a = x.
The declaration of a global variable or function does not match the corresponding declaration on a different file. Example: -- file1.c ---typedef struct { int f; int g; } A; A global; // LINE 6 void print_A(A par) // LINE 8 { printf("%d %d", par.f, par.g); } -- file2.c ---typedef struct { int f; char g; // Should be: int g; } A; A global; void print_A(A); main() { print_A(global); } "file1.
Action: Ensure that all elements/fields of an array/struct are unconditionally initialized prior to accessing them. Reference: 20074 variable %s (field "%s") may be used before its value is set Cause: A field of a struct may be referenced prior to its initialization. Example: struct A { int a; int b; }; struct A a; a.a = 10; if (cond) a.b = 12; foo(a); // warning 20074: field b of struct a may // be uninitialized.
20201 Memory leak is detected Cause: A memory leak is detected for the memory allocation done at the location mentioned in the message. Example: #include #include #include int leak1 (int k) { char *p = malloc (k); // LINE 6 strcpy (p, "hello"); printf ("%s", p); return 0; } "memleak.c", line 6, procedure leak1: warning #20201-D: Memory leak is detected. Action: Make sure that the pointer allocated at the location mentioned in the diagnostic is freed correctly.
Example: #include int foo() { int *p; { int q; scanf("%d", &q); p = &q; } // out of scope reference to q return *p; } int main() { int result = foo(); return result; } "oos.c", line 11, procedure foo: warning #20203-D: Potential out of scope use of local variable q Action: Check that the local variable mentioned in the diagnostic does not have its address taken and returned to the caller function or an allocated memory pointer is not returned to the caller.
20208 Forming out of bound address(%s) Cause: The expression is forming an address which is out of object's memory boundary. Example: char buf[12]; char *p; void foo() { int i = 20; p = &buf[0] + i; // LINE 7 } line 7, procedure foo: warning #20208-D: Forming out of bound address (In expression "&buf[0]+20", variable "buf" [test.c:1] (type: char [12]) has byte range [0 .. 11], forming address byte [20].) Action: Fix the forming out of bounds access if it is a real bug.
const char * bstring = "bar"; void mod_astring() { char* w = (char*) astring; *w = 'g'; // LINE 9 } int x; void mod_bstring() { char* s; if (x == 11) s = (char*) bstring; else { s = (char*) malloc(128); if (s == 0) exit(1); } sprintf(s,"%d",x); // LINE 25 puts(s); } line 9, procedure mod_astring: warning #20213-D: Potential write to readonly memory through astring is detected line 25, procedure possible: warning #20213-D: Potential write to readonly memory through s is detected Action: Look at the definiti
struct S { int v; int c;}; int foo2(int n) { struct S var; for (int i=10; i