2017-02-16 4 views
-2

Когда я отладки моей программы с помощью GDB и команды печати типа, он печатает это:snprintf не создает правильную команду

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\[email protected]\000\000\000\000\000p\[email protected]\00 ... and so on 

Normaly он должен просто создать простую команду как полукокса? Если я прав. Это приводит к другой проблеме, потому что popen() не может создать правильный поток.

Вот мой важный код:

+2

Программа неполная, не может воспроизвести. Что определяется 'row' ** как **? Для одной вещи. Кроме того, обратите внимание, что то, что gdb показывает вам, есть дамп памяти. * String * заканчивается на нулевом байте ('\ 000'). – DevSolar

+0

Диагностический шрифт 'command' (то есть' printf ("[% s] \ n", command); ') сказал бы вам, что передавалось' popen() '. Аналогично, если вы напечатали возвращаемый буфер ('printf (" [% s] \ n ", buff);'), он скажет вам, есть ли 'someth' в данных. Вы не проверяли статус возврата из 'fgets()' - вы не знаете, получили ли он какие-либо данные, поэтому вы не знаете, может ли быть актуальным содержимое 'buff'. Квадратные скобки, добавленные в форматы printf, помогут вам, среди прочего, идентифицировать конечные пробелы или встроенные новые строки или возврат каретки. Я обычно использую их. –

+2

Я не вижу никакого кода. – Gerhardh

ответ

2

Поскольку command является массивом (не char *), когда вы говорите GDB для print command, он печатает все содержимое, в том числе что-либо в буфере после задней NUL характера. Поэтому, когда вы видите:

$4 = "sudo asterisk -rx \"pjsip show aor 101\"\000\000b\[email protected]\000\000\000\000\000p\[email protected]\00 
               ^^^^ -- NUL character 

Его показывая вам, что snprintf помещается в буфер, а также то, что случайные вещи оказались в памяти на стеке, когда функция была запущена и стек пространство было зарезервировано для command

Смежные вопросы