sprintf (буфер, “%s […]”, буфер, […]) безопасен?

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

<build>
    ....
    <plugins>
       <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
            <execution>
              <phase>package</phase>
              <configuration>
                <tasks>
                  <!-- Ant copy tasks go here -->
                </tasks>
              </configuration>
              <goals>
                <goal>run</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
     </plugins>
  </build>
20
задан Bill the Lizard 29 July 2012 в 01:19
поделиться

3 ответа

Из документации glibc sprintf () :

Поведение этой функции следующее undefined, если происходит копирование между перекрывающимися объектами - для Например, если s также задано как аргумент для печати под контролем преобразования "% s".

Это может быть безопасно в конкретной реализации; но вы не могли рассчитывать на его переносимость.

Я также не уверен, что ваше предложение будет безопасным во всех случаях. У вас все еще могут быть перекрывающиеся буферы. Уже поздно, и моя жена меня обманывает, но я думаю, что у вас все еще может быть случай, когда вы хотите снова использовать исходную строку в объединенной строке и перезаписывать нулевой символ, и поэтому реализация sprintf может не знать, где повторно используется строка заканчивается.

Возможно, вам просто захочется прикрепить snprint () к временному буферу, а затем strncat () к исходному буферу.

19
ответ дан 30 November 2019 в 00:52
поделиться

В данном конкретном случае это будет работать, потому что строка в буфере будет первой, что будет введено в буфер ( опять же, бесполезно), поэтому вы должны использовать strcat () вместо этого, чтобы получить [почти] тот же эффект.

Но если вы пытаетесь объединить strcat () с возможности форматирования sprintf () , вы можете попробовать следующее:

sprintf(&buffer[strlen(buffer)], " <input type='file' name='%s' />\r\n", id);
4
ответ дан 30 November 2019 в 00:52
поделиться

Если вы хотите объединить форматированный текст в конец буфера с помощью printf (), я бы рекомендовал вам использовать целое число для отслеживания конечной позиции.

int i = strlen(buffer);
i += sprintf(&buffer[i], " <input type='file' name='%s' />\r\n", id);
i += sprintf(&buffer[i], "</td>");

или:

int i = strlen(buffer);
i += sprintf(&buffer[i], " <input type='file' name='%s' />\r\n", id);
strcat(&buffer[i], "</td>");

И прежде чем люди сойдут с ума, проголосовав против этого («Это небезопасно! Вы можете переполнить буфер!»), Я просто обращаюсь к разумному способу создания форматированной строки на C / C ++.

3
ответ дан 30 November 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: