чтобы проверить, действительно ли ввод действителен для ввода программ C

Например, у меня есть файл, заполненный некоторыми довольно грубыми строками.

12345678900 1111111111111111111111111  1234567890- 1234567890 123456789 12345678 1234567 1234567 123456 12345 1234 123 123 12 1 0 . - :(){ :|:& };: 1sd2f3g4hrtjghkjgfhdgsf env x='() { :;}; echo vulnerable' bash -c "echo this is a test" )(*&^%$#@#$%\^&*()) ;;;;;;;;;;;;;; $#TSDG:we;ggeg;#G; wg;weg3gsdgd \0 \n \a23tssg \x302\ 0x1235123 \243ti8jw90ed8j |92dg $$$$$$$$$$$$ ##$ #!@#$%\^&*()_+ + = ] [ ] \ ? > < " '" 

Как я могу получить эти типы строк для ввода в программу?

Без разрушения? Есть ли лучшее решение?

Что это называется, и где я могу найти ресурсы для такого рода тестирования?

В настоящее время я пытаюсь:

 #! /bin/bash while read l;do printf "$l" | ./c_program;done < test_numbers.txt 

c_program:

 # include <test.h> # include <stdio.h> int main(void) { printf("Number:\n"); int number = GetLong(); printf("Entered: %i\n",number); return 0; } 

3 Solutions collect form web for “чтобы проверить, действительно ли ввод действителен для ввода программ C”

Кажется, вы очень близко подошли к чему-то, что должно сработать. Я бы изменил его так:

 while IFS= read -rl; do printf "%s\n" "$l" | ./c_program; done < test_numbers.txt 
  • Скажем, read l а не read $l .
  • Используйте read -r для чтения «сырых» строк (не интерпретировать обратную косую черту).
  • Используйте IFS= для захвата ведущих и конечных пробелов.
  • Не говорите printf "$l" ; который сломается, если $l содержит % .

Это, похоже, не подходит для xargs , но я смог придумать следующее:

 tr '\n' '\0' < test_numbers.txt | xargs -0 -L1 -I{} sh -c 'printf "%s\n" "$1" | ./c_program' _ {} 
  • tr преобразует новые строки в файл в nulls; -0 указывает xargs ожидать этого.
    • Я сделал это, чтобы получить тот же эффект, что и read -r ; т.е. не интерпретировать обратную косую черту. Там может быть лучший способ.
  • -L1 сообщает xargs для вызова программы один раз для каждой (каждой) строки ввода.
  • Поскольку xargs может обрабатывать только простые команды, используйте sh -c '...' для выполнения конвейера.
 awk {'print $1'} test_numbers.txt |./c_program 
 grep -v '[^0-9]' <infile |./cprogram 

Это будет печатать только пустые строки или строки, содержащие только номера в вашей программе. Вы также можете редактировать каждую строку …

 sed 's/[^0-9]//g' <infile |./cprogram 

Вы можете фильтровать пустоты …

 sed -n 's/[^0-9]//g;/./p' <infile |./cprogram 

Или вы можете включить . и / или знак:

 sed -n 's/[^- .0-9]//g s/[.0-9]*[0-9]-[0-9.]*//g s/[0-9.]*[0-9].[0-9]*[0-9].[0-9]*//g s/[.-]*[.-][.-][^0-9][^ ]*//g /./p' </infile | ./cprogram . sed -n 's/[^- .0-9]//g s/[.0-9]*[0-9]-[0-9.]*//g s/[0-9.]*[0-9].[0-9]*[0-9].[0-9]*//g s/[.-]*[.-][.-][^0-9][^ ]*//g /./p' </infile | ./cprogram 
  • Если условие не работает в скрипте над ssh
  • `test` и` [`- разные бинарные файлы, любая разница?
  • Использование -n и -z в тестировании встроено - Bash
  • Как я могу использовать команды bash, если тесты и найти команды вместе?
  • bash: -eq vs. == и `bc` тип вывода
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • Как использовать отрицание команды в цикле while с grep в сценарии оболочки?
  • Невозможно сравнить результат lsb_release с строкой в ​​Bash
  • Linux и Unix - лучшая ОС в мире.