문제

I ran across the error Socket operation on non-socket in some of my networking code when calling connect and spent a lot of time trying to figure out what was causing it. I finally figured out that the following line of code was causing the problem:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {

See the problem? Here's what the line should look like:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

What I don't understand is why the first, incorrect line doesn't produce a warning. To put it another way, shouldn't the general form:

if ( foo = bar() < baz ) do_something();

look odd to the compiler, especially running with g++ -Wall -Wextra?

If not, shouldn't it at least show up as "bad style" to cppcheck, which I'm also running as part of my compile?

도움이 되었습니까?

해결책

Actually, you don't get any warning because of the double parenthesis (.

Try to remove one pair, and you'll get the warning back.

#include <iostream>

int foo()
{
    return 2;
}

int main(int /*argc*/, char** /*argv*/)
{
    int l;

    if ((l = foo() < 3)) // Won't generate warning under gcc
    {
    }

    if (l = foo() < 3) // will generate a warning "warning: suggest parentheses around assignment used as truth value"
    {
    }

    return EXIT_SUCCESS;
}

To avoid such annoying mistakes/typos, I avoid assigning a value and testing it in the same statement. That's too much error prone imho.

다른 팁

That's one reason why I try not to do too much in one statement. Instead of

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

Why not:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top