2013-01-22 35 views
7

Theo tiêu đề, tôi dự định di chuyển một số mã cũ đã phát triển một thập kỷ + trước cho AIX. Vấn đề là cơ sở mã là rất lớn. Các nhà phát triển đã không khởi tạo con trỏ của họ trong mã ban đầu. Bây giờ trong khi di chuyển mã đến các máy chủ mới nhất, tôi thấy một số vấn đề với nó.Di chuyển mã C++: xử lý các con trỏ chưa được khởi tạo

Tôi biết rằng giải pháp tốt nhất là chạy qua tất cả mã và khởi tạo tất cả các biến ở bất kỳ nơi nào bắt buộc. Tuy nhiên, tôi chỉ muốn biết nếu có bất kỳ giải pháp khác có sẵn cho vấn đề này. Tôi đã thử google nhưng không thể tìm thấy câu trả lời thích hợp.

+2

Trình biên dịch của bạn trên AIX có khởi tạo chúng cho bạn không? Mã có phụ thuộc vào (các) giá trị trong bộ nhớ chưa được khởi tạo không? Nếu câu trả lời cho cả hai là "Không", thì bạn có thể thử biên dịch mã trên máy chủ mới và xem điều gì xảy ra. Mã của bạn có thể không an toàn khủng khiếp về mặt lý thuyết, nhưng trong thực tế nó có thể chỉ hoạt động. –

+2

"Tôi thấy một số vấn đề với mã". nghĩa là? Có phải là bạn đang thực sự nhìn thấy thất bại, hoặc đơn giản là bạn đang phát hiện ra rằng "con trỏ này không được khởi tạo, nhưng có lẽ đó không phải là một vấn đề"? Khởi tạo con trỏ mà sau này được đặt thành một giá trị khác vô điều kiện không phục vụ mục đích nào trong và của chính nó [nó có thể làm cho nó rõ ràng hơn rằng DEFINITELY được đặt thành một cái gì đó]. –

+1

Giải pháp tốt nhất là khởi tạo tất cả các con trỏ. Không có phương pháp an toàn hơn. – andre

Trả lời

2

Cách tiếp cận lâu dài nhất về phòng ngừa là khởi tạo tất cả các con trỏ tại vị trí mà chúng được khai báo, thay đổi mã để sử dụng con trỏ thông minh thích hợp để quản lý tuổi thọ. Nếu bạn có bất kỳ loại xét nghiệm đơn vị, việc tái cấu trúc này có thể tương đối không đau. Trong một thời hạn ngắn hơn và nếu bạn đang chuyển sang Linux, bạn có thể sử dụng valgrind và có được một shot tốt khi theo dõi một hoặc hai vấn đề thực sự đang cắn bạn, cho bạn thời gian để tái cấu trúc với tốc độ nhàn nhã hơn.

2

Chỉ cần khởi tạo tất cả các biến có thể không phải là một ý tưởng hay.

Hành vi đáng tin cậy thường phụ thuộc vào các biến có giá trị được biết là chính xác ("được đảm bảo bằng cách xây dựng" là chính xác). Vấn đề với các biến chưa được khởi tạo không đơn giản là chúng có giá trị không xác định. Rõ ràng là không rõ là một vấn đề, nhưng một lần nữa các mong muốn sate là có được biết đến và chính xác giá trị. Việc khởi tạo một biến cho một giá trị đã biết không chính xác không mang lại hành vi đáng tin cậy.

Không thường xuyên xảy ra rằng không có giá trị 'mặc định' nào là đúng để sử dụng làm dự phòng nếu khởi tạo phức tạp hơn không thành công. Một chương trình có thể chọn không khởi tạo biến có giá trị nếu giá trị đó phải được ghi đè trước khi biến có thể được sử dụng.

Việc khởi tạo biến thành giá trị mặc định có thể có một vài sự cố trong các trường hợp như vậy. Thông thường các giá trị 'mặc định' không quan trọng ở chỗ nếu chúng được sử dụng thì hậu quả không rõ ràng ngay lập tức. Điều đó thường không được mong muốn bởi vì với tư cách là nhà phát triển bạn muốn chú ý khi mọi thứ xảy ra sai. Bạn có thể tránh vấn đề này bằng cách chọn các giá trị mặc định sẽ có hậu quả rõ ràng, nhưng điều đó không giải quyết được vấn đề thứ hai; Các máy phân tích tĩnh thường có thể phát hiện và báo cáo khi một biến chưa được khởi tạo được sử dụng. Nếu có vấn đề với một số logic khởi tạo phức tạp sao cho không có giá trị nào được đặt, bạn muốn có thể phát hiện được. Đặt giá trị mặc định sẽ ngăn phân tích tĩnh phát hiện các trường hợp như vậy. Vì vậy, có những trường hợp bạn không muốn khởi tạo biến.


Với gợi ý giá trị mặc định là thường nullptr, mà đến một mức độ nhất định tránh được vấn đề đầu tiên thảo luận ở trên vì dereferencing một con trỏ null thường tạo ra một vụ tai nạn ngay lập tức (tốt để gỡ lỗi). Tuy nhiên mã cũng có thể phát hiện một con trỏ null và báo cáo một lỗi (tốt cho gỡ lỗi) hoặc có thể rơi trở lại một số phương pháp khác (xấu để gỡ lỗi). Bạn có thể sử dụng phân tích tĩnh tốt hơn để phát hiện các tập quán của các con trỏ chưa được khởi tạo thay vì khởi tạo chúng. Mặc dù phân tích tĩnh có thể phát hiện dereferencing của con trỏ null nó sẽ không phát hiện khi con trỏ null gây ra báo cáo lỗi hoặc thói quen dự phòng được sử dụng.


Đáp lại bình luận của bạn:

Những vấn đề lớn mà tôi thấy là

  • Con trỏ tới biến cục bộ được trả về từ chức năng.
  • Hầu như tất cả các biến con trỏ không được khởi tạo. Tôi chắc chắn rằng AIX cung cấp sự thoải mái này cho khách hàng trong nền tảng trước đó tuy nhiên tôi thực sự nghi ngờ rằng mã sẽ chạy hoàn hảo trong Linux khi nó đang được đưa vào thử nghiệm thực tế (sản xuất).
  • Tôi không thể cung cấp các giải pháp từng phần có thể hoạt động. tôi thích để cung cấp cho tốt nhất cho khách hàng của tôi, những người trả tiền cho công việc của tôi. Vì vậy, Wont thích sử dụng cách giải quyết.
  • Chất lượng không thể bị xâm phạm.
  • sửa chữa chúng (và đặc biệt chú ý để làm sạch một cách chính xác lên)
  • Như tôi đã tranh luận ở trên chỉ đơn giản là thiếu một initializer không có trong và của chính nó một khiếm khuyết. Chỉ có một khiếm khuyết nếu giá trị uninitialized thực sự được sử dụng một cách bất hợp pháp. Tôi không chắc chắn những gì bạn có ý nghĩa về AIX cung cấp sự thoải mái.
  • Khi tôi tranh luận ở trên 'giải pháp một phần' và 'cách giải quyết' sẽ là khởi tạo một cách mù quáng mọi thứ.
  • Một lần nữa, một cách mù quáng khởi tạo mọi thứ có thể dẫn đến không chỉ trong công việc vô ích, mà nó thực sự có thể thỏa hiệp chất lượng bằng cách lấy đi một số công cụ để phát hiện lỗi.
+0

Các vấn đề chính mà tôi thấy là -Điểm đến các biến cục bộ được trả về từ các hàm. -Cuối cùng tất cả các biến con trỏ không được khởi tạo. Tôi chắc chắn rằng AIX cung cấp sự thoải mái này cho khách hàng trong nền tảng trước đó tuy nhiên tôi thực sự nghi ngờ rằng mã sẽ chạy hoàn hảo trong Linux khi nó đang được đưa vào thử nghiệm thực tế (sản xuất). -Tôi không thể cung cấp một phần giải pháp có thể hoạt động.tôi thích để cung cấp cho tốt nhất cho khách hàng của tôi, những người trả tiền cho công việc của tôi. Vì vậy, Wont thích sử dụng cách giải quyết. -Chất lượng không thể bị xâm phạm. – kris123456

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