Заголовок этого сообщения очень похож на то, что я искал в связи с этим. Каждый результат, с которым я сталкивался, касался переполнения буфера, и это не то, что мне нужно.
Моя функция выполняет итерацию по каждому имени файла в директивной структуре, которую я ранее заполнял. Каждое имя файла различается по размеру, от очень маленького до довольно большого.
Раньше моя функция создавала буфер размером 2048 байт. Затем введите l oop. Во время каждой итерации l oop буфер заполняется путем к целевому каталогу плюс текущее имя файла в каталоге, присоединенное к его концу. Используя новый путь в буфере, я выполняю несколько небольших файловых операций. Это происходит до тех пор, пока не будет достигнуто окончательное имя файла в структуре.
Проблема, однако, в том, что не каждый полный путь будет составлять 2048 байтов. Некоторые могут не иметь даже трети этого размера.
Возвращаясь к этой функции, я переместил создание буфера в l oop, и каждая итерация l oop создает буфер размером n
, где n
- the length of the target directory + the length of the current filename within the directory
.
Мне интересно, можно ли это считать плохой практикой или чем-то еще. Лучше ли мне создать буфер заранее и всегда иметь для него заданный размер, даже если 2/3 буфера иногда не используются? Или лучше создать буфер только того размера, который мне нужен?
Надеюсь, я дал достаточно информации ... Заранее спасибо!
Здесь - рассматриваемая функция.
int verifyFiles(DIR *dp, const char *pathroot){
struct dirent *dir;
struct stat pathstat;
//char path[2048];
int status = 0;
while((dir = readdir(dp)) != NULL){
if(!strncmp(dir->d_name, ".", 1))
continue;
size_t len = strlen(pathroot) + strlen(dir->d_name) + 2;
char path[len];
snprintf(path, sizeof(path), "%s/%s", pathroot, dir->d_name);
// verify shebang is present on the first line of path's contents.
if(!shebangPresent(path)){
status = -1;
break;
}
// verify path belongs to the user.
stat(path, &pathstat);
if(pathstat.st_uid != getuid()){
status = -1;
break;
}
}
return status;
}