Баг или не баг. G++ 4.7.2
От: lnkuser  
Дата: 20.07.13 07:07
Оценка: -2 :))) :)))
Добрый день!

Столкнулся с аномалией. В нижеприведенном коде пытаюсь получить МАС из arp таблицы. Для воспроизведения надо поставить в строке 50


cout << resolve_mac("192.168.1.1") << endl;


адрес устройства, видимого в вашей локальной сети и чтобы он был виден в вашей arp таблице (arp -n).

компилирую без ошибок и варнингов
$ g++ bug.cpp --std=c++0x -Wall -Wextra

пустой вывод, видимо возвращается NULL
$ ./a.out

$

Раскомментируем простой cout в строке 36

cout << "> " << ip << endl;


и код работает как надо, тоесть функция возвращает МАС как и задумывалось.

$ ./a.out
> 192.168.1.1
00:01:02:03:04:05


Я создал багрепорт http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57937, там мне ответили что дело в возвращении адреса локальной переменной.
Но! Я не могу понять, как влияет простой cout на возвращение или не возвращение адреса локальной переменной ? При чем тут вообще cout?



#include <iostream>
#include <arpa/inet.h>
#include <string.h>

using namespace std;

#define PROCFS_ARP "/proc/net/arp"


const char * resolve_mac(const char *ip_to_resolve)
{
    uint32_t ipaddr = inet_addr(ip_to_resolve);
    if (ipaddr == INADDR_NONE)
        return NULL;

    char ip[100];
    char hwa[100];
    char mask[100];
    char line[100];
    char dev[100];
    int flags, num, type;

    FILE *fp;

    fp = fopen(PROCFS_ARP, "r");
    if (fp == NULL)
        return NULL;

    memset(&hwa, 0, sizeof(hwa));

    if (fgets(line, sizeof(line), fp) != (char *)NULL) {
        for (; fgets(line, sizeof(line), fp); ) {
            num = sscanf(line, "%s 0x%x 0x%x %100s %100s %100s\n", ip, &type, &flags, hwa, mask, dev);
            if (num < 4)
                break;
            //cout << "> " << ip << endl;
            if (inet_addr(ip) == ipaddr) {
                const char *m = hwa;
                return m;
            }
        }
    }

    return NULL;
}


int main()
{
    cout << resolve_mac("192.168.1.1") << endl;
    return 0;
}





Ubuntu 12.10 с последними обновлениями.

$ g++ -v
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)


$ uname -a
Linux notebook 3.5.0-36-generic #57-Ubuntu SMP Wed Jun 19 15:10:49 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.