Ошибка «Socket operation on non-socket» из-за странного синтаксиса - PullRequest
4 голосов
/ 17 июня 2010

Я столкнулся с ошибкой Socket operation on non-socket в моем сетевом коде при вызове connect и потратил много времени, пытаясь выяснить, что его вызвало.Я наконец понял, что следующая строка кода вызывает проблему:

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

Видите проблему?Вот как должна выглядеть строка:

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

Я не понимаю, почему первая неправильная строка не выдает предупреждение.Иными словами, разве общая форма:

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

не должна выглядеть странно для компилятора, особенно при работе с g++ -Wall -Wextra?

Если нет, разве это не должно выглядеть как "плохой стиль" для cppcheck, который я также запускаю как часть моей компиляции?

Ответы [ 2 ]

5 голосов
/ 17 июня 2010

На самом деле, вы не получите никакого предупреждения из-за двойных скобок (.

Попробуйте удалить одну пару, и вы получите предупреждение.

#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;
}

Чтобы избежать таких досадных ошибок / опечаток, я избегаю присваивать значение и проверять его в одном и том же утверждении.Это слишком много ошибок, имхо.

2 голосов
/ 17 июня 2010

Это одна из причин, почему я стараюсь не делать слишком много в одном утверждении Вместо

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

Почему бы и нет:

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