1. Си / Говнокод #4340

    +144

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    void addSlash( const char* command, char* sdo )
    {
    	int command_length;
    	char *command_line = command;
    	command_length = strlen(command);
    	
    	while(command_length>0){
    		switch(*command_line){
    		   case '"':
    		           strcpy(sdo+strlen(sdo),"\\");
    		   default:
    		           strcpy(sdo+strlen(sdo), command_line);
    		}
    		command_line++;
    		command_length--;
    	}
    }

    Должно быть добавление слешей перед двойными кавычками.

    Запостил: absolut, 11 Октября 2010

    Комментарии (8) RSS

    • Ну так это бред какой-то, который выглядит просто-напросто недописанным. Одного тестового прогона сразу хватило бы для того, чтобы увидеть, что код на выходе геренирует белиберду, ничего общего не имеющую с его предназначением.

      О сущестовании `strcat` аффтар, очевидно, не знал, посему усердно эмулировал `strcat` через `strcpy + strlen`, хотя и то и другое - неверно, т.к. ясно, что добавлять в хвост надо было только один символ, а не всю оставшуюся входную строку.

      В приниципе это даже и не компилируемо в строгом Си компиляторе. Си он хоть и Си, но нарушать const correctness тем не менее не позволяет. Поэтому `char *command_line = command` - это уже ошибка. Видимо использовавшийся компилер ограничился варнингом, который был аффтором проигнорирован.
      Ответить
      • > выглядит просто-напросто недописанным.
        Подавляющее большинство кода на этом сайте из такого разряда. Так что не удивляйтесь.
        >мулировал `strcat` через `strcpy + strlen`
        Именно в этом и есть основная соль данного примера.
        На счет const. В классическом C его не было вовсе. А там где начинал появляться не всегда выполнял требования предъявляемые к современному понятию о const. Таким образом, могу вам с уверенностью сказать, что предупреждений компилятора в данном случае не было.
        Ответить
        • Если он использовал компилятор С выпуска 70-80-х годов прошлого века, тогда предупреждений может быть и не было. Но если речь идет мало-мальски современном компиляторе ANSI С (скажем из 90-х или новее), то предупреждения, разумеется, были и еще какие.
          Ответить
    • строка увеличивается. а кто память реаллочить будет? оппаааа. вдруг откуда не возьмись появилось в ротебись
      Ответить
      • Данный код не претендует на полноту.
        Ответить
        • да не, просто идеология. Двигая указатель и делая стрцпи мы наталкиваемся на конечность выделенной памяти=вырвать волосы на жопе при отладке
          Ответить
          • В некоторых случаях максимальная длина известна заранее и память уже выделена. Так что реаллочить не приходится. В общем случае при достаточно большой строке можно и на нехватку памяти нарваться, но это вовсе не значит, что надо везде пихать проверку при выделении.
            Ответить

    Добавить комментарий