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?
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
add a comment |
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
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
add a comment |
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
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
c gcc clang static-analysis
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
add a comment |
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
add a comment |
3 Answers
3
active
oldest
votes
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.
My code is some simplified variant of refactored code where functions previously returned aboolvalue and where converted to return richer values. Thereturn trueresp.return falsewas 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,trueandfalsecould 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, usingstdbool.hcan 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 ofstdbool.h).
– cmaster
4 hours ago
add a comment |
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.
add a comment |
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.
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.gccdoes this already for lot of valid C99 code (even for indentation issues), seems to know something about_Boolitself (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 likeint * p = (int*) 3;
– 4386427
4 hours ago
|
show 3 more comments
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
My code is some simplified variant of refactored code where functions previously returned aboolvalue and where converted to return richer values. Thereturn trueresp.return falsewas 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,trueandfalsecould 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, usingstdbool.hcan 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 ofstdbool.h).
– cmaster
4 hours ago
add a comment |
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.
My code is some simplified variant of refactored code where functions previously returned aboolvalue and where converted to return richer values. Thereturn trueresp.return falsewas 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,trueandfalsecould 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, usingstdbool.hcan 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 ofstdbool.h).
– cmaster
4 hours ago
add a comment |
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.
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.
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 aboolvalue and where converted to return richer values. Thereturn trueresp.return falsewas 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,trueandfalsecould 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, usingstdbool.hcan 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 ofstdbool.h).
– cmaster
4 hours ago
add a comment |
My code is some simplified variant of refactored code where functions previously returned aboolvalue and where converted to return richer values. Thereturn trueresp.return falsewas 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,trueandfalsecould 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, usingstdbool.hcan 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 ofstdbool.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
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered 4 hours ago
Antti HaapalaAntti Haapala
84.5k16161202
84.5k16161202
add a comment |
add a comment |
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.
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.gccdoes this already for lot of valid C99 code (even for indentation issues), seems to know something about_Boolitself (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 likeint * p = (int*) 3;
– 4386427
4 hours ago
|
show 3 more comments
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.
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.gccdoes this already for lot of valid C99 code (even for indentation issues), seems to know something about_Boolitself (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 likeint * p = (int*) 3;
– 4386427
4 hours ago
|
show 3 more comments
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.
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.
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.gccdoes this already for lot of valid C99 code (even for indentation issues), seems to know something about_Boolitself (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 likeint * p = (int*) 3;
– 4386427
4 hours ago
|
show 3 more comments
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.gccdoes this already for lot of valid C99 code (even for indentation issues), seems to know something about_Boolitself (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 likeint * 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
|
show 3 more comments
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e)
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom))
StackExchange.using('gps', function() StackExchange.gps.track('embedded_signup_form.view', location: 'question_page' ); );
$window.unbind('scroll', onScroll);
;
$window.on('scroll', onScroll);
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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