2012-02-13 7 views
7

Tôi có dòng sau trong chương trình của tôi gây ra một cảnh báo thời gian chạy:Tuyên bố hardcoded std :: string gây tràn bộ đệm

if (!is_directory("C:\\NGFMS_Debug\\Files") && !create_directories("C:\\NGFMS_Debug\\Files")) 

Các văn bản của các cảnh báo là như vậy: "Một tràn bộ đệm đã xảy ra trong XXX.exe đã làm hỏng trạng thái nội bộ của chương trình. "

Cảnh báo có trong lệnh gọi đến "is_directory (...)". Tôi đoán không gian cho chuỗi không được phân bổ, nhưng tôi nghĩ cú pháp như thế này là hợp pháp.

Chức năng is_directory là một phần của tăng/filesystem.hpp và tôi đang sử dụng không gian tên sau đây:

using namespace boost; 
using namespace boost::filesystem; 
using namespace std; 

này được nhận được biên soạn dưới VS2005 C++. Bất kỳ ý tưởng?

Cập nhật

Tôi đã thử một vài điều khác nhau và bước qua mã và đây là những gì tôi tìm thấy.

Nếu tôi làm điều này

char* path_chars_c; 
path_chars_c = "C:\\Debug\\Files"; 
string path_str_c(path_chars_c); 

Các path_chars_c biến chứa chuỗi thích hợp, nhưng path_str_c biến chứa rác sau khi khởi tạo. Vì vậy, nó xuất hiện rằng khởi tạo chuỗi bị hỏng ở đây. Có ai đã từng nhìn thấy điều này?

+0

Lỗi tràn bộ đệm không gây ra ngoại lệ - nếu bạn thực sự thấy ngoại lệ thì bạn cần cung cấp thêm thông tin. – ildjarn

+0

@ildjarn Tôi nhìn thấy điểm ngắt cửa sổ mà tôi cho là vậy. Bài đăng đã thay đổi tương ứng. – Ian

+0

Tôi đang bối rối. Đây có phải là cảnh báo trình biên dịch không? Bạn nên đăng nguyên văn thư. – Gabe

Trả lời

6

Đây là một lỗi đáng ngạc nhiên - có vẻ như sử dụng tiêu chuẩn khá tăng :: hệ thống tập tin :: is_directory(). Bạn đã thử bước vào nó w/một trình gỡ lỗi để xem nơi vấn đề xảy ra?

Một (từ xa) khả năng xuất hiện trong đầu - nếu bạn đang liên kết các thư viện đã bật NDEBUG với các thư viện đã tắt NDEBUG, bạn có thể gặp sự cố. Đặc biệt, một vài kiểu dữ liệu tăng sẽ phân bổ một số trường gỡ lỗi bổ sung khi gỡ lỗi được bật. Vì vậy, nếu một đối tượng được tạo ra bởi một đoạn mã mà nghĩ rằng gỡ lỗi là tắt, nhưng sau đó được sử dụng bởi một đoạn mã mà nghĩ rằng gỡ lỗi là trên, sau đó bạn có thể nhận được lỗi bộ nhớ ngẫu nhiên (chẳng hạn như tràn bộ đệm).

+0

Wow, đó là một dự đoán cực kỳ tốt. Đảm bảo mọi thứ được biên dịch trong chế độ DEBUG đã sửa nó. – Ian