2009-04-12 39 views
6

Làm thế nào tôi có thể ngăn chặn sau đây cảnh báo từ mối liên kết gcc:Suppress: việc sử dụng của `mktemp' là nguy hiểm

cảnh báo: việc sử dụng 'mktemp' là nguy hiểm, sử dụng tốt hơn 'mkstemp'

Tôi biết rằng tốt hơn nên sử dụng mkstemp() nhưng vì một lý do nào đó tôi phải sử dụng chức năng mktemp().

+0

Sử dụng mkstemp thay vì mktemp. –

+3

Lý do bạn phải sử dụng mktemp là gì? –

Trả lời

8

Tôi đoán bạn cần đường dẫn vì bạn chuyển nó tới thư viện chỉ chấp nhận tên đường dẫn làm đối số chứ không chấp nhận tên mô tả hoặc FILE con trỏ. Nếu vậy bạn có thể tạo một thư mục tạm thời với mkdtemp và đặt tệp của bạn ở đó, tên thực tế sau đó không quan trọng vì đường dẫn đã là duy nhất vì thư mục.

+7

Bạn hoàn toàn có thể STILL sử dụng mkstemp: int fd = mkstemp (template); Sau cuộc gọi này, mẫu sẽ được thay thế bằng tên tệp thực. Bạn sẽ có bộ mô tả tệp và đường dẫn của tệp. –

+0

@ Jason Coco bạn có thể cân nhắc đưa ra một câu trả lời, để nó có thể được upvoted ;-) – lothar

+0

@ Jason Coco, ah ok, nghe có vẻ hợp lý :). Tôi đồng ý với lothar làm cho một câu trả lời ra khỏi nó. – quinmars

4

Nếu bạn để sử dụng mktemp thì không có bất kỳ điều gì bạn có thể làm để ngăn chặn cảnh báo về việc xóa phần sử dụng mktemp khỏi libc.so.6.

Tại sao bạn để sử dụng mktemp?

0

Nếu bạn đang liên kết tĩnh thời gian chạy, thì tùy chọn khác là viết phiên bản mktemp của riêng bạn vào một tệp đối tượng. Trình liên kết nên thích phiên bản của bạn hơn phiên bản thời gian chạy.

Chỉnh sửa: Cảm ơn Jason Coco đã chỉ ra một sự hiểu lầm chính mà tôi có trong số mktemp và người thân của nó. Điều này là một chút dễ dàng hơn để giải quyết ngay bây giờ. Vì trình liên kết sẽ thích một phiên bản trong một tệp đối tượng, bạn chỉ cần viết mktemp theo điều khoản của mkstemp.

Những khó khăn duy nhất là làm sạch các bộ mô tả tệp mà mkstemp sẽ trả lại cho bạn và làm cho mọi thứ đều an toàn. Bạn có thể sử dụng một mảng mô tả tĩnh và một hàm đăng ký atexit để dọn dẹp nếu bạn có thể đặt giới hạn cho bao nhiêu tệp tạm thời mà bạn cần. Nếu không, chỉ cần sử dụng danh sách được liên kết thay thế.

+1

@D: Nó là một lỗi để cung cấp một chuỗi liên tục để mkstemp hoặc mktemp vì cuộc gọi thư viện sẽ cố gắng để thay đổi chuỗi và bạn sẽ nhận được một lỗi xe buýt. –

4

Hai điều:

  • mktemp không phải là một chức năng tiêu chuẩn
  • cảnh báo là một người đặc biệt thực hiện trong mối liên kết như .gnu.warning.mktemp phần

Sử dụng một hệ điều hành API nguồn gốc nếu bạn thực sự cần để ghi vào đĩa. Hoặc mkstemp() như được đề xuất.

+0

mktemp() là (hoặc là) một hàm tiêu chuẩn. Ví dụ trong POSIX.1-2001. Nhưng đừng sử dụng nó. –

0

Sử dụng mkstemp:

int fd = mkstemp(template); 

Sau cuộc gọi này, template sẽ được thay thế bằng tên tập tin thực tế. Bạn sẽ có bộ mô tả tệp và đường dẫn của tệp.

Các vấn đề liên quan