thetna
thetna

Reputation: 7143

warning: variable set but not used [-Wunused-but-set-variable]

I have been getting following warning while compiling the C source code in the gcc 4.6.1.

   warning: variable set but not used [-Wunused-but-set-variable]

I refered to this link Wunused but could get exactly what is causing this warning.Would anybody tell me in more details what is causing this warning and how can We get rid of it?

[EDIT] I have a following snippet of code. The compile shows the above mentioned warning. Could you please suggest me how can correct it?

   test_function(){
   BOOL BoolTest;
   BoolTest = test_fucntion2();

   #ifdef CHECK
   if (!BoolTest) {
   misc_StartErrorReport();
   misc_ErrorReport("\n test_function2: Input not indexed.\n");
   misc_FinishErrorReport();
          }
   #endif
   // 
    BoolTest is no more used below it.
   // } 

Upvotes: 9

Views: 92009

Answers (6)

jian
jian

Reputation: 4824

https://gcc.gnu.org/gcc-4.6/porting_to.html

New warnings for unused variables and parameters

The behavior of -Wall has changed and now includes the new warning flags -Wunused-but-set-variable and (with -Wall -Wextra) -Wunused-but-set-parameter. This may result in new warnings in code that compiled cleanly with previous versions of GCC.

For example,

void fn (void) { int foo; foo = bar (); /* foo is never used. */ }

Gives the following diagnostic:

warning: variable "foo" set but not used [-Wunused-but-set-variable]

Although these warnings will not result in compilation failure, often -Wall is used in conjunction with -Werror and as a result, new warnings are turned into new errors.

To fix, first see if the unused variable or parameter can be removed without changing the result or logic of the surrounding code. If not, annotate it with __attribute__((__unused__)).

As a workaround, add -Wno-error=unused-but-set-variable or -Wno-error=unused-but-set-parameter.

Upvotes: 2

Carlo Wood
Carlo Wood

Reputation: 6801

With g++ 7.x and higher and clang++ 4.x and higher (using c++11 or higher), as well as with Visual Studio 2017 version 15.3 and later (available with /std:c++17), you can use the standarized [[maybe_unused]] attribute.

For example,

int main()
{
    int x [[maybe_unused]] = 5;
}

will not give a warning, not even with -Wunused-variable and the likes.

Upvotes: 5

caf
caf

Reputation: 239071

You need to include the preprocessor guards around the declaration and initialisation of BoolTest:

test_function()
{
#ifdef CHECK
    BOOL BoolTest = test_function2();
#else
    test_function2();
#endif


#ifdef CHECK
    if (!BoolTest) {
        misc_StartErrorReport();
        misc_ErrorReport("\n test_function2: Input not indexed.\n");
        misc_FinishErrorReport();
    }
#endif

(this assumes that you still want to call test_function2() even if CHECK is not defined, presumably for its side-effects - if not, then you don't need the #else section and you can combine the two #ifdef blocks into one).

Upvotes: 8

mahmood
mahmood

Reputation: 24715

You have not used BoolTest. You can see there is no difference between your code and

test_function(){
#ifdef CHECK
if (!test_fucntion2()) {

Upvotes: 0

pmg
pmg

Reputation: 108938

Setting a variable is assigning it a value (maybe implicitly)

int main(void) {
    int local1, local2;
    local1 = 0; /* local1 set to 0 */
    local2 = 0; /* local2 set to 0 */
    return 0;
}

In the program above, both variables were set to a value but they weren't used. If I replace the second line with

    int local2 = local1;

now I have used the local1 variable -- and the warnings should be only 1.

To get rid of the warning, delete the assignment from your code. This may, in turn create other warnings ... :)

Upvotes: 5

RustyTheBoyRobot
RustyTheBoyRobot

Reputation: 5945

It means that you assign a value to a variable, but then you never read that value later in your code (hence the verbage, "set but not used"). For example:

int useful = 10;
int useless = 3;
if (useful) {
    //Do stuff
}

Notice that you give both useful and useless values, but you only read the value in useful. Usually, when I get this message it means that I forgot about a variable or found a way to inline a statement that no longer needs that variable.

Upvotes: 3

Related Questions