Ответил ниже, хабр для новых пользователей не даёт ответить после первого комментария почему-то, только новый комментарий оставить.
Похоже, код просто не предполагает то, что stdin перенаправлен на файл. А если поток перенаправлен и в нем в последней строке не окажется \n, то последний символ удалится — больше похоже на note, чем ошибку.
Это и удивило, что такой пустяк на 4й позиции ошибок оказался, хотя это и вовсе не ошибка, если код предназначен для работы исключительно из консоли и исключительно для ввода текстовых команд. Думаю, не стоит брать в счёт то, что интерпретатор cmd умеет такую дичь делать, как на видео. Если такое брать во внимание, то вообще fgets для stdin использовать нельзя окажется.
Полагаю, время писать статью "Как VasRedDoor и zhekov оказлись внимательнее PVS Studio и 3х с половиной человек".
Если вводится не текст, то это уже не текстовый поток, использовать fgets с ним нельзя в принципе. Ожидается текст, а анализатор предлагает костыли писать к fgets, как то странно. Если анализатор предполагает, что stdin может быть бинарный потоком, то уже предлагать менять fgets на fread надо.
Спасибо за ответ.
Подскажите, пожалуйста, по 4 месту, может я чего-то не знаю.
fgets возвращает строку с \n или возвращает null, если поток больше не содержит данных (в нашем случае stdin перенаправлен на файл), получается записывает в command_buf как минимум один символ (перевод строки). Т.е. strlen(command_buf) будет всегда >= 1, если fgets вернул не указатель на command_buf. Разве нет?
Ответил ниже, хабр для новых пользователей не даёт ответить после первого комментария почему-то, только новый комментарий оставить.
Похоже, код просто не предполагает то, что stdin перенаправлен на файл. А если поток перенаправлен и в нем в последней строке не окажется \n, то последний символ удалится — больше похоже на note, чем ошибку.
Это и удивило, что такой пустяк на 4й позиции ошибок оказался, хотя это и вовсе не ошибка, если код предназначен для работы исключительно из консоли и исключительно для ввода текстовых команд. Думаю, не стоит брать в счёт то, что интерпретатор cmd умеет такую дичь делать, как на видео. Если такое брать во внимание, то вообще fgets для stdin использовать нельзя окажется.
Полагаю, время писать статью "Как VasRedDoor и zhekov оказлись внимательнее PVS Studio и 3х с половиной человек".
Всем спасибо за ответы!
Спасибо за ответ.
fgets возвращает строку с \n или возвращает null, если поток больше не содержит данных (в нашем случае stdin перенаправлен на файл), получается записывает в command_buf как минимум один символ (перевод строки). Т.е. strlen(command_buf) будет всегда >= 1, если fgets вернул не указатель на command_buf. Разве нет?