News for hackers. Stuff that matters.
Re:Clang is better than GCC by userbinator on Sunday November 27, 2022 @08:01PM (#33768662)
When I see "!=0" in C code, it's immediately suspicious, along the same lines as "== true" or "== false" (or worse, "!= true" and "!= false", both of which I've seen in codebases before.) Just write if(memcmp( ... )) or if(!memcmp(...)).
Re:Clang is better than GCC by dataflow on Sunday November 27, 2022 @08:35PM (#33768869)
I would agree on this for some cases (and I suspect more so for != NULL than != 0), but memcmp() != 0 isn't one of them. There are multiple reasons why, some more generic than others, but two of them are very specific to memcmp():

1. There are similar functions (like std::lexicographical_compare() in C++) returning bool instead an int.

2. It's not crazy to read memcmp() as comparing for equality rather than ordering. i.e. I think when you see 'if (memcmp(a, b, n))', it's quite natural for one's brain to read it as "if a and b are equal..."

For someone who uses memcmp() on a daily basis, you probably don't encounter these misconceptions. But as someone who writes C++ and merely deals with C once in a while in the process, both of these possibilities have tripped me up multiple times when seeing if (memcmp(...)). Writing != 0 has always cleared that confusion for me, since it immediately signals the result (a) isn't meant to be read as a Boolean, and (b) might be negative, thus putting my brain on alert.

Re:Clang is better than GCC by Stratoscope on Sunday November 27, 2022 @09:29PM (#33769196)
When I used to write a lot of C code, my solution for this was to avoid calling memcmp() directly at all when I only cared about a yes/no on the match. Instead I used a wrapper I called memeq():

  int memeq( const void* lhs, const void* rhs, size_t count ) {
    return memcmp( lhs, rhs, count ) == 0;
  }
One could have an analogous memneq() with != 0, but I preferred to just use the ! operator on the memeq() result.

I would also use a typedef for the struct, so you don't have to keep writing "struct" everywhere:

  typedef struct {
    int x, y, z;
  } tmp;
With those two tricks, the erroneous memcmp() call becomes:

    if( ! memeq( m_result_original, m_result_my_version, sizeof(tmp) ) )
You're a lot less likely to get that wrong!
Re:Clang is better than GCC by jcelerier on Monday November 28, 2022 @09:04AM (#33773747)
Reading this makes me appreciate how nice it is in c++ to just be able to do operator==() = default; to let the compiler generate the appropriate comparator automatically
Re:Clang is better than GCC by twiceaday on Sunday November 27, 2022 @08:13PM (#33768735)
I disagree. I avoid implicit casting, including truthiness. "== true" is indeed suspicious because you aren't avoiding anything, but to me "!= 0" or "!= nullptr" are crisper.
Re:Clang is better than GCC by userbinator on Sunday November 27, 2022 @09:24PM (#33769166)
I don't know what you mean by "crisper", but in general I've noticed that extraneous code only increases the chance of bugs (and this is a good example of that.) if(foo) and if(!foo) are very common idioms and should be committed to the subconscious memory.
Re:Clang is better than GCC by WirelessGigabit on Sunday November 27, 2022 @09:30PM (#33769200)
!= 0 should only be used for ints / floats / 'numbers'.

Comparing it to false requires me to know that false is 0. Comparing it to a ptr requires me to know that 0 represents a pointer pointing to nothing.

Re:Clang is better than GCC by djur on Sunday November 27, 2022 @11:10PM (#33769734)
0 is the false value in C, no implicit casting or "truthiness" involved. The C standard explicitly defines if statements in terms of zero: "the first substatement is executed if the expression compares unequal to 0... [else] is executed if the expression compares equal to 0".

C does not have a boolean type. (The `true` and `false` defined in stdbool.h are macros expanding to the integer literals 1 and 0, respectively.)

Re:Clang is better than GCC by 3836293648 on Monday November 28, 2022 @02:42AM (#33770784)
C has a boolean type, it just doesn't have true and false constants in that type.
Re:Clang is better than GCC by pjmlp on Monday November 28, 2022 @04:04AM (#33771302)
C23 replaces them with proper keywords.
Re:Clang is better than GCC by djur on Monday November 28, 2022 @06:50PM (#33781617)
Yes, although they still evaluate to 0 and 1 and conditional logic is still defined in terms of 0 and 1. Maybe that will change at some point in the future as well!
Re:Clang is better than GCC by UncleEntity on Monday November 28, 2022 @08:51AM (#33773627)
They aren’t testing for ‘false’ in this case but for success.

Functions which return 0 on success I always compare with 0 as “if (foo()) error();” easily gets confusing. If I see “if (foo() != 0) error();” then I can easily tell what’s going on because C is funny like that.

Conversely, if I’m testing for truthfulness or NULL I’ll use the boolean operators.

Re:Clang is better than GCC by nrclark on Sunday November 27, 2022 @08:07PM (#33768694)
I write comparisons against 0 or false/true sometimes. There are places where it improves code clarity IMO.
Re:Clang is better than GCC by 77pt77 on Sunday November 27, 2022 @08:15PM (#33768753)
It's not suspicious.

Also, put the constant value (0 or true or null) on the left side.

Re:Clang is better than GCC by sigjuice on Sunday November 27, 2022 @08:39PM (#33768888)
The Yoda conditional.
Re:Clang is better than GCC by downvotetruth on Sunday November 27, 2022 @10:29PM (#33769516)
Former variable assignment conditional (FVAC), which is inferior to latter variable assignment (0=i) & conditional (i=0), but necessitated by the declaration syntax.
Re:Clang is better than GCC by 77pt77 on Sunday November 27, 2022 @11:11PM (#33769742)
TIL. Loved it!
Re:Clang is better than GCC by kevin_thibedeau on Sunday November 27, 2022 @08:46PM (#33768929)
There are coding standards that don't allow implicit truthiness testing. They're misguided but they exist.
Re:Clang is better than GCC by djur on Sunday November 27, 2022 @11:11PM (#33769748)
In C? C doesn't have a concept of truthiness, just zero and nonzero.
Re:Clang is better than GCC by asveikau on Sunday November 27, 2022 @11:06PM (#33769714)
This is a stylistic choice. In my personal opinion, I agree with you. But I've seen styles that swear by the other way that you and I don't like. And I respect those who hold those opinions in good faith. I think someone once told me misra-c requires != 0.
Re:Clang is better than GCC by tmtvl on Monday November 28, 2022 @07:25AM (#33772740)
So you would dislike seeing code like, say...

  if (!((my_ptr = malloc (sizeof (struct my_struct))) != NULL))
    exit (1);