Domanda

Per un programma che sto scrivendo, è utile per me calcolare le dimensioni dei file, che calcolo usando le funzioni Tellg e Seekg di IOSTREAM, ma questo porta a un avvertimento da parte del protettore. Il seguente codice riproduce il "problema":

#include <iostream>

std::streamsize get_file_size(std::ifstream& ifs) { // line 12 (in warning, below)
  const std::streamsize start = ifs.tellg();
  ifs.seekg(0,std::ios::end);
  const std::streamsize end = ifs.tellg();
  ifs.seekg(start);
  return (end-start);
}

G ++ (bandiere: -fstack-protector -wstack-protector, versione del compilatore: 4.4.3 (Ubuntu 4.4.3-4ubuntu5), Sistema: Ubuntu 10.04 x86_64) dà l'avvertimento:

f.cc: nella funzione 'std :: freamsize get_file_size (std :: ifstream &)':
F.cc:12: ATTENZIONE: Non proteggere la funzione: nessun buffer di almeno 8 byte lungo

(Ottengo gli stessi risultati quando uso GCC 4.5.2, scaricato e compilato direttamente da GNU.)

Questo è previsto da come funziona Stack Smashing Protection (in generale o da GCC) e/o come se Stream e Seekg/Tellg funzionano? In tal caso, questo avvertimento non può essere ignorato o c'è qualcosa di meglio che posso fare?

Modificare:

In realtà, parte del codice sopra è ridondante. Solo per chiarire cosa sta succedendo:

#include <iostream>

void f1(std::ifstream& ifs) { // line 6
    ifs.tellg();
}

void f2(std::ifstream& ifs) { // line 10
    // call seekg(std::streampos)
    ifs.seekg(0);
}

void f3(std::ifstream& ifs) {
    // call seekg(std::streamoff, std::ios_base::seekdir)
    ifs.seekg(0,std::ios::beg);
}

porta a G ++ (stesse specifiche di sopra) Avviso:

main.cc: nella funzione 'void f1 (std :: ifstream &)':
main.cc:6: ATTENZIONE: Non proteggere la funzione: nessun buffer almeno 8 byte di lunghezza
main.cc: nella funzione 'void f2 (std :: ifstream &)':
main.cc:10: ATTENZIONE: Non proteggere la funzione: nessun buffer almeno 8 byte di lunghezza

È interessante notare, f3 non attiva un avvertimento.

È stato utile?

Soluzione

Potresti non vedere questo.

E il consiglio generale è Non dovresti davvero preoccuparti, specialmente nel tuo caso, quando non si alloca alcun buffer interno che può essere utilizzato per eseguire l'attacco di overflow del buffer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top