gcc: how to detect bad `bool` usage2019 Community Moderator ElectionHow do I download and install lint?How do you set, clear, and toggle a single bit?What is the difference between g++ and gcc?Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?Catch incorrect usage of c boolInconsistent gcc diagnostic for string initializationCan we add CV-qualifiers to the arguments of main?gcc vs clang: Meaning of -pedantic-errorsNo warning for uninitialized objects, wrong order in constructionHow to detect all buffer access by using Clang Static CheckerStricit aliasing violation: Why gcc and clang generate different output?

gcc: how to detect bad `bool` usage

Convergence in probability and convergence in distribution

Describing a chess game in a novel

Are ETF trackers fundamentally better than individual stocks?

Is there a hypothetical scenario that would make Earth uninhabitable for humans, but not for (the majority of) other animals?

Life insurance that covers only simultaneous/dual deaths

Why do passenger jet manufacturers design their planes with stall prevention systems?

Problem with FindRoot

Why no Iridium-level flares from other satellites?

Most cost effective thermostat setting: consistent temperature vs. lowest temperature possible

Why does a Star of David appear at a rally with Francisco Franco?

How to write cleanly even if my character uses expletive language?

Employee lack of ownership

How to solve this challenging limit?

Are all passive ability checks floors for active ability checks?

How do I hide Chekhov's Gun?

Pauli exclusion principle

Do I need life insurance if I can cover my own funeral costs?

Recruiter wants very extensive technical details about all of my previous work

Python if-else code style for reduced code for rounding floats

As a new Ubuntu desktop 18.04 LTS user, do I need to use ufw for a firewall or is iptables sufficient?

"of which" is correct here?

What is a ^ b and (a & b) << 1?

Brexit - No Deal Rejection



gcc: how to detect bad `bool` usage



2019 Community Moderator ElectionHow do I download and install lint?How do you set, clear, and toggle a single bit?What is the difference between g++ and gcc?Why doesn't GCC optimize a*a*a*a*a*a to (a*a*a)*(a*a*a)?Catch incorrect usage of c boolInconsistent gcc diagnostic for string initializationCan we add CV-qualifiers to the arguments of main?gcc vs clang: Meaning of -pedantic-errorsNo warning for uninitialized objects, wrong order in constructionHow to detect all buffer access by using Clang Static CheckerStricit aliasing violation: Why gcc and clang generate different output?










7















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
    5 hours ago












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

    – Richard Chambers
    4 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
    4 hours ago















7















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
    5 hours ago












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

    – Richard Chambers
    4 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
    4 hours ago













7












7








7


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 5 hours ago









enscensc

4,336815




4,336815












  • 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
    5 hours ago












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

    – Richard Chambers
    4 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
    4 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
    5 hours ago












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

    – Richard Chambers
    4 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
    4 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
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
5 hours ago














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

– Richard Chambers
4 hours ago





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

– Richard Chambers
4 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
4 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
4 hours ago












3 Answers
3






active

oldest

votes


















3














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
    4 hours ago






  • 1





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

    – wildplasser
    4 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
    4 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
    4 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






























    0














    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

























    • 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
      4 hours ago











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

      – 4386427
      4 hours ago











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

      – ensc
      4 hours ago











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

      – Gerhardh
      4 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
      4 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









    3














    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
      4 hours ago






    • 1





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

      – wildplasser
      4 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
      4 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
      4 hours ago















    3














    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
      4 hours ago






    • 1





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

      – wildplasser
      4 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
      4 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
      4 hours ago













    3












    3








    3







    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 2 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
      4 hours ago






    • 1





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

      – wildplasser
      4 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
      4 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
      4 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
      4 hours ago






    • 1





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

      – wildplasser
      4 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
      4 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
      4 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
    4 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
    4 hours ago




    1




    1





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

    – wildplasser
    4 hours ago






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

    – wildplasser
    4 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
    4 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
    4 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
    4 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
    4 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 4 hours ago









        Antti HaapalaAntti Haapala

        84.5k16161202




        84.5k16161202





















            0














            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

























            • 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
              4 hours ago











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

              – 4386427
              4 hours ago











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

              – ensc
              4 hours ago











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

              – Gerhardh
              4 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
              4 hours ago















            0














            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

























            • 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
              4 hours ago











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

              – 4386427
              4 hours ago











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

              – ensc
              4 hours ago











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

              – Gerhardh
              4 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
              4 hours ago













            0












            0








            0







            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 4 hours ago

























            answered 4 hours ago









            43864274386427

            21.8k31846




            21.8k31846












            • 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
              4 hours ago











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

              – 4386427
              4 hours ago











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

              – ensc
              4 hours ago











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

              – Gerhardh
              4 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
              4 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
              4 hours ago











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

              – 4386427
              4 hours ago











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

              – ensc
              4 hours ago











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

              – Gerhardh
              4 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
              4 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
            4 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
            4 hours ago













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

            – 4386427
            4 hours ago





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

            – 4386427
            4 hours ago













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

            – ensc
            4 hours ago





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

            – ensc
            4 hours ago













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

            – Gerhardh
            4 hours ago





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

            – Gerhardh
            4 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
            4 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
            4 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

            acmart: Multiple authors: all with same affiliation, one author an additional affiliationHow to Write Names of Multiple Authors with Shared Affiliation in ACM 2017 Template?Multiple authors with different primary affiliation, but same additional affiliationSame affiliation for all authors without extra packagesIOS-Book-Article.cls: one author with multiple affiliationacmart: Shared Author AffiliationMultiple authors with different primary affiliation, but same additional affiliationAuthor affiliation with only 1 authorAdding Multiple Authors with Different Affiliation in LaTeX ArticleLaTeX: Multiple authors stays on same lineHow to Label Multiple Authors with Same DescriptionHow to make two authors use the same affiliationTwo authors with same affiliation on finished front page

            How to write “ä” and other umlauts and accented letters in bibliography?Accents in BibTeXSorting references with special characters alphabeticallyUse ae ligature in bibliographyEastern European nameInverted circumflex in BibTexBibTex, non-ascii initials and nameptr fproblems with accent in LatexHow to add a Ø to my bibliography from Jabref?References without accentsTroubles when trying to cite St“omer-Verlet in ”title" field of a bib entryComprehensive list of accented charactersHow to type the letter “i” with two dots (diaeresis) in math mode?Problem with glossary text and accented lettersSpecial character in bibliographyAccented letters, Unicode and LaTeX accentsHow to stop natbib from modifying bibliography styleCitation of a paper with non-standard characters by BibtexWrite accented characters to file using writeHow to group the bibliography alphabetically, if some surnames start with “accented” characters?How can I automatically capitalize significant words in my bibliography?

            Problem using RevTeX4-1 with “! Undefined control sequence. @bibitemShut”