gcc: how to detect bad `bool` usage












8















Is there some way to detect the bad usage of bool values in code like



#include <stdbool.h>

void *foo(void)
{
return false;
}

int bar(void)
{
return true;
}


Both functions are accepted by gcc (8.3.1) and clang (7.0.1) without any warnings



$ gcc -Wall -W -pedantic -c x.c
$ clang -Xclang -analyzer-checker=alpha --analyze -Wall -W -pedantic -c x.c
$ clang -Wall -W -pedantic -c x.c
$


Compiling as C++ code would detect the problem in foo() but is not an option but rest of code is C, not C++.



Are there other (-W) options or switches which would create diagnostics for these cases?










share|improve this question























  • Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

    – Richard Chambers
    6 hours ago













  • Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

    – Richard Chambers
    5 hours ago











  • @RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

    – ensc
    5 hours ago
















8















Is there some way to detect the bad usage of bool values in code like



#include <stdbool.h>

void *foo(void)
{
return false;
}

int bar(void)
{
return true;
}


Both functions are accepted by gcc (8.3.1) and clang (7.0.1) without any warnings



$ gcc -Wall -W -pedantic -c x.c
$ clang -Xclang -analyzer-checker=alpha --analyze -Wall -W -pedantic -c x.c
$ clang -Wall -W -pedantic -c x.c
$


Compiling as C++ code would detect the problem in foo() but is not an option but rest of code is C, not C++.



Are there other (-W) options or switches which would create diagnostics for these cases?










share|improve this question























  • Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

    – Richard Chambers
    6 hours ago













  • Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

    – Richard Chambers
    5 hours ago











  • @RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

    – ensc
    5 hours ago














8












8








8


1






Is there some way to detect the bad usage of bool values in code like



#include <stdbool.h>

void *foo(void)
{
return false;
}

int bar(void)
{
return true;
}


Both functions are accepted by gcc (8.3.1) and clang (7.0.1) without any warnings



$ gcc -Wall -W -pedantic -c x.c
$ clang -Xclang -analyzer-checker=alpha --analyze -Wall -W -pedantic -c x.c
$ clang -Wall -W -pedantic -c x.c
$


Compiling as C++ code would detect the problem in foo() but is not an option but rest of code is C, not C++.



Are there other (-W) options or switches which would create diagnostics for these cases?










share|improve this question














Is there some way to detect the bad usage of bool values in code like



#include <stdbool.h>

void *foo(void)
{
return false;
}

int bar(void)
{
return true;
}


Both functions are accepted by gcc (8.3.1) and clang (7.0.1) without any warnings



$ gcc -Wall -W -pedantic -c x.c
$ clang -Xclang -analyzer-checker=alpha --analyze -Wall -W -pedantic -c x.c
$ clang -Wall -W -pedantic -c x.c
$


Compiling as C++ code would detect the problem in foo() but is not an option but rest of code is C, not C++.



Are there other (-W) options or switches which would create diagnostics for these cases?







c gcc clang static-analysis






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 6 hours ago









enscensc

4,341815




4,341815













  • Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

    – Richard Chambers
    6 hours ago













  • Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

    – Richard Chambers
    5 hours ago











  • @RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

    – ensc
    5 hours ago



















  • Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

    – Richard Chambers
    6 hours ago













  • Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

    – Richard Chambers
    5 hours ago











  • @RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

    – ensc
    5 hours ago

















Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

– Richard Chambers
6 hours ago







Would lint catch these? Especially an updated tool such as PCLint? See for instance invisible-island.net/personal/lint-tools.html and see this about lint pubs.opengroup.org/onlinepubs/7908799/xcu/lint.html

– Richard Chambers
6 hours ago















Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

– Richard Chambers
5 hours ago





Looks like there is an updated version, splint, stackoverflow.com/questions/6881269/…

– Richard Chambers
5 hours ago













@RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

– ensc
5 hours ago





@RichardChambers thinks for the hint; but "splint" does not seem to understand C99+ at all and aborts when seeing variadic macros (e.g. #define log_err(_fmt, ...)).

– ensc
5 hours ago












3 Answers
3






active

oldest

votes


















2














Make the example less trivial:



bool x;

void *foo(void)
{
return x;
}

int bar(void)
{
return x;
}


and it want compile at all.



usually true and false are just definitions and have value 1 and 0



From the stdbool.h header file



#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool _Bool
#define true 1
#define false 0

#else /* __cplusplus */


in your first example you just return zero and most compilers will not warn as they treat it as NULL. Try to return true and you will get the warning.






share|improve this answer


























  • My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

    – ensc
    5 hours ago






  • 1





    Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

    – wildplasser
    5 hours ago













  • @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

    – Leushenko
    5 hours ago











  • @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

    – cmaster
    5 hours ago



















1














C defines the <stdbool.h> macros true and false as expanding to integer constant expressions of value 1 and 0 respectively. Since they're ints and bool (_Bool) in itself is an integer type, any such usage is equally valid. Even the value of the boolean expressions in C is an int and not a bool, so there is not much help for you with the bar function.



However, foo is a different beast - if the return value were true then it would be caught right away because 1 is not convertible to a pointer. false, having the integer constant value 0 is a null-pointer constant and will be converted to null pointer. You could perhaps catch the incorrect use by replacing the #include <stdbool.h> with something that does the inclusion but defines false as say 0.0 which is a falsy value but not an integer constant expression.






share|improve this answer































    -1














    The interresting part here is that you call it "bad usage". But the code is perfectly valid.



    _Bool is an integer type.



    From the standard:




    7.18 The macro bool expands to _Bool.




    and




    6.2.4 An object declared as type _Bool is large enough to store the values 0 and 1.




    and




    6.3.2.3 An integer may be converted to any pointer type.




    So there is nothing in your code that violates the standard.



    That said, you may get a warning for a missing cast to void* but besides that there is no reason for any warnings.



    The code may look strange and in theory a compiler could detect that and give a warning. To my knowledge there is no compiler that will do that.






    share|improve this answer





















    • 1





      I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

      – ensc
      5 hours ago











    • @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

      – 4386427
      5 hours ago






    • 1





      because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

      – ensc
      5 hours ago











    • @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

      – Gerhardh
      5 hours ago











    • @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

      – 4386427
      5 hours ago











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55198396%2fgcc-how-to-detect-bad-bool-usage%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    2














    Make the example less trivial:



    bool x;

    void *foo(void)
    {
    return x;
    }

    int bar(void)
    {
    return x;
    }


    and it want compile at all.



    usually true and false are just definitions and have value 1 and 0



    From the stdbool.h header file



    #ifndef _STDBOOL_H
    #define _STDBOOL_H

    #ifndef __cplusplus

    #define bool _Bool
    #define true 1
    #define false 0

    #else /* __cplusplus */


    in your first example you just return zero and most compilers will not warn as they treat it as NULL. Try to return true and you will get the warning.






    share|improve this answer


























    • My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

      – ensc
      5 hours ago






    • 1





      Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

      – wildplasser
      5 hours ago













    • @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

      – Leushenko
      5 hours ago











    • @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

      – cmaster
      5 hours ago
















    2














    Make the example less trivial:



    bool x;

    void *foo(void)
    {
    return x;
    }

    int bar(void)
    {
    return x;
    }


    and it want compile at all.



    usually true and false are just definitions and have value 1 and 0



    From the stdbool.h header file



    #ifndef _STDBOOL_H
    #define _STDBOOL_H

    #ifndef __cplusplus

    #define bool _Bool
    #define true 1
    #define false 0

    #else /* __cplusplus */


    in your first example you just return zero and most compilers will not warn as they treat it as NULL. Try to return true and you will get the warning.






    share|improve this answer


























    • My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

      – ensc
      5 hours ago






    • 1





      Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

      – wildplasser
      5 hours ago













    • @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

      – Leushenko
      5 hours ago











    • @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

      – cmaster
      5 hours ago














    2












    2








    2







    Make the example less trivial:



    bool x;

    void *foo(void)
    {
    return x;
    }

    int bar(void)
    {
    return x;
    }


    and it want compile at all.



    usually true and false are just definitions and have value 1 and 0



    From the stdbool.h header file



    #ifndef _STDBOOL_H
    #define _STDBOOL_H

    #ifndef __cplusplus

    #define bool _Bool
    #define true 1
    #define false 0

    #else /* __cplusplus */


    in your first example you just return zero and most compilers will not warn as they treat it as NULL. Try to return true and you will get the warning.






    share|improve this answer















    Make the example less trivial:



    bool x;

    void *foo(void)
    {
    return x;
    }

    int bar(void)
    {
    return x;
    }


    and it want compile at all.



    usually true and false are just definitions and have value 1 and 0



    From the stdbool.h header file



    #ifndef _STDBOOL_H
    #define _STDBOOL_H

    #ifndef __cplusplus

    #define bool _Bool
    #define true 1
    #define false 0

    #else /* __cplusplus */


    in your first example you just return zero and most compilers will not warn as they treat it as NULL. Try to return true and you will get the warning.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 3 hours ago









    machine_1

    2,47921332




    2,47921332










    answered 5 hours ago









    P__J__P__J__

    11.3k2726




    11.3k2726













    • My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

      – ensc
      5 hours ago






    • 1





      Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

      – wildplasser
      5 hours ago













    • @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

      – Leushenko
      5 hours ago











    • @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

      – cmaster
      5 hours ago



















    • My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

      – ensc
      5 hours ago






    • 1





      Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

      – wildplasser
      5 hours ago













    • @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

      – Leushenko
      5 hours ago











    • @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

      – cmaster
      5 hours ago

















    My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

    – ensc
    5 hours ago





    My code is some simplified variant of refactored code where functions previously returned a bool value and where converted to return richer values. The return true resp. return false was missed in the refactoring and stayed literally; I just want to detect them.

    – ensc
    5 hours ago




    1




    1





    Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

    – wildplasser
    5 hours ago







    Just don't include stdbool.h (you don't need it), and you'll catch all the occurences.

    – wildplasser
    5 hours ago















    @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

    – Leushenko
    5 hours ago





    @wildplasser or if stdbool.h is buried deeper, a temporary local redefinition to "break" bool, true and false could also help identify the places to change. (don't leave it like that, but...)

    – Leushenko
    5 hours ago













    @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

    – cmaster
    5 hours ago





    @wildplasser Not a good idea. In my experience, using stdbool.h can significantly increase code readability, simply because booleans are labeled as such. Of course, I would have preferred a definition like ((_Bool)0), but I've never run into the OP's problem (even though I'm making liberal use of stdbool.h).

    – cmaster
    5 hours ago













    1














    C defines the <stdbool.h> macros true and false as expanding to integer constant expressions of value 1 and 0 respectively. Since they're ints and bool (_Bool) in itself is an integer type, any such usage is equally valid. Even the value of the boolean expressions in C is an int and not a bool, so there is not much help for you with the bar function.



    However, foo is a different beast - if the return value were true then it would be caught right away because 1 is not convertible to a pointer. false, having the integer constant value 0 is a null-pointer constant and will be converted to null pointer. You could perhaps catch the incorrect use by replacing the #include <stdbool.h> with something that does the inclusion but defines false as say 0.0 which is a falsy value but not an integer constant expression.






    share|improve this answer




























      1














      C defines the <stdbool.h> macros true and false as expanding to integer constant expressions of value 1 and 0 respectively. Since they're ints and bool (_Bool) in itself is an integer type, any such usage is equally valid. Even the value of the boolean expressions in C is an int and not a bool, so there is not much help for you with the bar function.



      However, foo is a different beast - if the return value were true then it would be caught right away because 1 is not convertible to a pointer. false, having the integer constant value 0 is a null-pointer constant and will be converted to null pointer. You could perhaps catch the incorrect use by replacing the #include <stdbool.h> with something that does the inclusion but defines false as say 0.0 which is a falsy value but not an integer constant expression.






      share|improve this answer


























        1












        1








        1







        C defines the <stdbool.h> macros true and false as expanding to integer constant expressions of value 1 and 0 respectively. Since they're ints and bool (_Bool) in itself is an integer type, any such usage is equally valid. Even the value of the boolean expressions in C is an int and not a bool, so there is not much help for you with the bar function.



        However, foo is a different beast - if the return value were true then it would be caught right away because 1 is not convertible to a pointer. false, having the integer constant value 0 is a null-pointer constant and will be converted to null pointer. You could perhaps catch the incorrect use by replacing the #include <stdbool.h> with something that does the inclusion but defines false as say 0.0 which is a falsy value but not an integer constant expression.






        share|improve this answer













        C defines the <stdbool.h> macros true and false as expanding to integer constant expressions of value 1 and 0 respectively. Since they're ints and bool (_Bool) in itself is an integer type, any such usage is equally valid. Even the value of the boolean expressions in C is an int and not a bool, so there is not much help for you with the bar function.



        However, foo is a different beast - if the return value were true then it would be caught right away because 1 is not convertible to a pointer. false, having the integer constant value 0 is a null-pointer constant and will be converted to null pointer. You could perhaps catch the incorrect use by replacing the #include <stdbool.h> with something that does the inclusion but defines false as say 0.0 which is a falsy value but not an integer constant expression.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 5 hours ago









        Antti HaapalaAntti Haapala

        84.5k16161202




        84.5k16161202























            -1














            The interresting part here is that you call it "bad usage". But the code is perfectly valid.



            _Bool is an integer type.



            From the standard:




            7.18 The macro bool expands to _Bool.




            and




            6.2.4 An object declared as type _Bool is large enough to store the values 0 and 1.




            and




            6.3.2.3 An integer may be converted to any pointer type.




            So there is nothing in your code that violates the standard.



            That said, you may get a warning for a missing cast to void* but besides that there is no reason for any warnings.



            The code may look strange and in theory a compiler could detect that and give a warning. To my knowledge there is no compiler that will do that.






            share|improve this answer





















            • 1





              I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

              – ensc
              5 hours ago











            • @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

              – 4386427
              5 hours ago






            • 1





              because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

              – ensc
              5 hours ago











            • @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

              – Gerhardh
              5 hours ago











            • @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

              – 4386427
              5 hours ago
















            -1














            The interresting part here is that you call it "bad usage". But the code is perfectly valid.



            _Bool is an integer type.



            From the standard:




            7.18 The macro bool expands to _Bool.




            and




            6.2.4 An object declared as type _Bool is large enough to store the values 0 and 1.




            and




            6.3.2.3 An integer may be converted to any pointer type.




            So there is nothing in your code that violates the standard.



            That said, you may get a warning for a missing cast to void* but besides that there is no reason for any warnings.



            The code may look strange and in theory a compiler could detect that and give a warning. To my knowledge there is no compiler that will do that.






            share|improve this answer





















            • 1





              I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

              – ensc
              5 hours ago











            • @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

              – 4386427
              5 hours ago






            • 1





              because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

              – ensc
              5 hours ago











            • @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

              – Gerhardh
              5 hours ago











            • @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

              – 4386427
              5 hours ago














            -1












            -1








            -1







            The interresting part here is that you call it "bad usage". But the code is perfectly valid.



            _Bool is an integer type.



            From the standard:




            7.18 The macro bool expands to _Bool.




            and




            6.2.4 An object declared as type _Bool is large enough to store the values 0 and 1.




            and




            6.3.2.3 An integer may be converted to any pointer type.




            So there is nothing in your code that violates the standard.



            That said, you may get a warning for a missing cast to void* but besides that there is no reason for any warnings.



            The code may look strange and in theory a compiler could detect that and give a warning. To my knowledge there is no compiler that will do that.






            share|improve this answer















            The interresting part here is that you call it "bad usage". But the code is perfectly valid.



            _Bool is an integer type.



            From the standard:




            7.18 The macro bool expands to _Bool.




            and




            6.2.4 An object declared as type _Bool is large enough to store the values 0 and 1.




            and




            6.3.2.3 An integer may be converted to any pointer type.




            So there is nothing in your code that violates the standard.



            That said, you may get a warning for a missing cast to void* but besides that there is no reason for any warnings.



            The code may look strange and in theory a compiler could detect that and give a warning. To my knowledge there is no compiler that will do that.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 5 hours ago

























            answered 5 hours ago









            43864274386427

            21.8k31846




            21.8k31846








            • 1





              I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

              – ensc
              5 hours ago











            • @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

              – 4386427
              5 hours ago






            • 1





              because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

              – ensc
              5 hours ago











            • @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

              – Gerhardh
              5 hours ago











            • @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

              – 4386427
              5 hours ago














            • 1





              I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

              – ensc
              5 hours ago











            • @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

              – 4386427
              5 hours ago






            • 1





              because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

              – ensc
              5 hours ago











            • @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

              – Gerhardh
              5 hours ago











            • @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

              – 4386427
              5 hours ago








            1




            1





            I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

            – ensc
            5 hours ago





            I know that this code is valid C99; but it is wrong and compilers are allowed to emit diagnostics for cases where they suspect broken code. gcc does this already for lot of valid C99 code (even for indentation issues), seems to know something about _Bool itself (see -fsanitize=bool) and I would like to have warnings about my broken code.

            – ensc
            5 hours ago













            @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

            – 4386427
            5 hours ago





            @ensc Maybe I misunderstand the whole question but... why do you expect warnings from code that complies with the standard?

            – 4386427
            5 hours ago




            1




            1





            because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

            – ensc
            5 hours ago





            because compilers are doing static code analysis noways and I expect that they warn about (obvious) problems.

            – ensc
            5 hours ago













            @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

            – Gerhardh
            5 hours ago





            @4386427 would you also claim that warnings about assignments in conditions are not useful? They are perfectly valid but nevertheless fishy.

            – Gerhardh
            5 hours ago













            @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

            – 4386427
            5 hours ago





            @ensc Hmm... so your question is really about getting a warning for "strange looking" but compliant code? If so... I obviously misunderstod your question. I don't know a way to get a warning for something like int * p = (int*) 3;

            – 4386427
            5 hours ago


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55198396%2fgcc-how-to-detect-bad-bool-usage%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Callistus I

            Tabula Rosettana

            How to label and detect the document text images