To get a trial key
fill out the form below
Team License (a basic version)
Enterprise License (an extended version)
* By clicking this button you agree to our Privacy Policy statement

Request our prices
New License
License Renewal
--Select currency--
* By clicking this button you agree to our Privacy Policy statement

Free PVS-Studio license for Microsoft MVP specialists
* By clicking this button you agree to our Privacy Policy statement

To get the licence for your open-source project, please fill out this form
* By clicking this button you agree to our Privacy Policy statement

I am interested to try it on the platforms:
* By clicking this button you agree to our Privacy Policy statement

Message submitted.

Your message has been sent. We will email you at

If you haven't received our response, please do the following:
check your Spam/Junk folder and click the "Not Spam" button for our message.
This way, you won't miss messages from our team in the future.

Issues in real programs - what errors a…

Issues in real programs - what errors are not there in the world...

Dec 10 2009

When testing the analyzer PVS-Studio on one of the projects we found an interesting error. This error does not refer to the topic of 64-bits although its consequences are diagnosed as 64-bit problems. But this error attracts attention due to its unusual character and we decided to describe it in the blog.

Here is the code of a program that, as the author had intended, was to print the value of the matrix items into the internal structure.

Matrix3 m;
TextOutput &t = ...;
t.printf("%10.5f, %10.5f, %10.5f,\n%10.5f,"
  "%10.5f, %10.5f,\n%10.5f, %10.5f, %10.5f)",
  m[0, 0], m[0, 1], m[0, 2],
  m[1, 0], m[1, 1], m[1, 2],
  m[2, 0], m[2, 1], m[2, 2]);

Of course, this code is incorrect although compiles well. It seems that the author, while developing the code, had been distracted by work on a project in a different language and therefore confused the syntaxes. As a result, the expressions of the type "1, 2″ have the value of the subexpression after the last comma according to C++ language rules. I.e. the expression "1, 2″ equals 2.

As a result, the given code is equivalent to this:

Matrix3 m;
TextOutput& t = ...;
t.printf("%10.5f, %10.5f, %10.5f,\n%10.5f,"
  "%10.5f, %10.5f,\n%10.5f, %10.5f, %10.5f)",
  m[0], m[1], m[2],
  m[0], m[1], m[2],
  m[0], m[1], m[2]);

Matrix3 class has an overloaded operator [] that returns the pointer to float type:

inline const float* operator[] (int iRow) const;

Of course, it does not matter at all to the function printf what to take as arguments: float or float*. The project compiles with the warning level /W3 and the compiler keeps silent when it comes to these suspicious constructs. To make Visual C++ generate the warning you should raise the warning level up to /W4. Then you will see the diagnostic warning "warning C4709: comma operator within array index expression".

PVS-Studio analyzer does not like this code too but due to a different reason. The expression "m[0]" has "float *" type, i.e. memsize-type and is an argument for the function with a variable number of arguments. The analyzer considers that this code can potentially contain errors and generates the diagnostic warning "error V111: Call function 'printf' with variable number of arguments. Second argument has memsize type."

Popular related articles

Comments (0)

Next comments
This website uses cookies and other technology to provide you a more personalized experience. By continuing the view of our web-pages you accept the terms of using these files. If you don't want your personal data to be processed, please, leave this site.
Learn More →