Có phải là khôn ngoan khi sử dụng Clang để phân tích mã cá nhân trong một dự án xây dựng với gcc?


8

Tôi bắt đầu làm việc trên một số dự án C đang xây dựng bằng cách sử dụng gcc. Tôi tin rằng sự lựa chọn này được thực hiện vì nhiều lý do:

  • Phải biên dịch chéo cho cánh tay từ rất sớm (tôi nghĩ).
  • Hiệu suất là thông số đầu tiên và quan trọng nhất.
  • gcc đã và vẫn là lựa chọn đầu tiên dễ dàng.

Tôi không có lý do để tranh cãi về sự lựa chọn đó và dù sao tôi cũng không ở vị trí để làm điều đó.

Các cơ sở mã của bất kỳ dự án duy nhất là tương đối nhỏ. Mọi dự án được xây dựng với Makefile tương đối sạch (hiện đang được làm mới), gcc -Wall -Wextragần như không phàn nàn gì và một số thử nghiệm tối thiểu đã được thực hiện. Không có phân tích tĩnh tự động hoặc định dạng mã được thực hiện và mã theo cú pháp không nhất quán, mặc dù nó rất dễ đọc và cảm thấy suy nghĩ.

Tôi không muốn định dạng lại từng dòng mã cùng một lúc, tôi dự định sẽ làm như được mô tả ở đâu đó xung quanh câu trả lời này (đặc biệt là vì bối cảnh thực sự không tệ): tái cấu trúc và chủ yếu định dạng lại càng nhiều càng tốt khi xử lý bất kỳ chủ đề nào, nhưng sill lấy chủ đề không có ý định phong cách mã trong tâm trí. Thật không may, tôi không ở vị trí áp đặt kiểu mã hoặc kiểm tra bổ sung cho các cam kết, nhưng tôi cảm thấy có ý nghĩa giữa các đồng nghiệp của mình rằng bạn nên tôn trọng quy ước mã hiện có khi sửa đổi tệp (Mặc dù tôi biết trạng thái hiện tại mã không xảy ra một cách kỳ diệu) và mong muốn viết mã tốt.

Đây là lần đầu tiên tôi lập trình bằng C với trạng thái tinh thần như vậy và tôi rất bị thu hút bởi các công cụ phân tích và định dạng mã khác nhau clangcung cấp.

Do đó, ý chính của câu hỏi của tôi là: nó có thể dẫn đến các vấn đề phải làm theo clanggợi ý và sử dụng clangcác công cụ định dạng và phân tích trong khi xây dựng gcckhông? Ví dụ: một số cảnh báo có thể đến từ một đại diện nội bộ gcckhông sử dụng hoặc từ mã byte clangsẽ có ý định tạo ra điều đó gcc.

Có cách nào tốt để tự động chuyển các gcctham số biên dịch (chủ yếu là mức kiến ​​trúc đích và mức tối ưu hóa) để clangcác gợi ý cảnh báo có ý nghĩa không?

Tôi sẽ thêm rằng tôi quen thuộc gccvà báo cáo lỗi của nó. Tôi quan tâm đến việc nhận được nhiều cảnh báo và lỗi hơn (có liên quan), không chỉ là những lời cảnh báo tốt hơn và dễ hiểu hơn. Vì vậy, nếu tôi không thể tin tưởng các gợi ý bổ sung clangcó thể tạo ra dựa trên đại diện nội bộ của nó bởi vì tôi xây dựng gccvào cuối ngày, thì tôi không thực sự quan tâm đến việc này.

Tôi bao gồm rất nhiều bối cảnh vì vậy hãy thoải mái đưa ra bất kỳ nhận xét hoặc trả lời bất kỳ câu hỏi tiềm ẩn nào tôi không thể đưa ra.


Về các quy ước mã, anh ấy cẩn thận không đẩy yêu thích của bạn vào một dự án hiện có. Nó không thể làm cho mọi thứ tốt hơn đáng kể và có thể gây khó chịu cho những người đóng góp khác. Cùng đi cho sự lựa chọn của các công cụ. Rất dễ dàng để bị đi lạc hướng với việc làm lại mọi thứ theo cách "đúng" mà không thực sự cải thiện thực sự.
beldaz

Câu trả lời:


9

Ví dụ: một số cảnh báo có thể đến từ một đại diện nội bộ mà gcc không sử dụng hoặc từ bytecode clang sẽ có ý định tạo ra gcc đó.

Cực kì không chắc chắn. Clang đang cảnh báo bạn về mã của bạn , không phải một số đại diện nội bộ mà nó sử dụng. Tất cả các cảnh báo phải xuất phát từ một điều đáng ngờ mà bạn đang thực hiện trong mã của mình, chứ không phải từ bất kỳ chi tiết triển khai nào về tiếng kêu.

Trường hợp bạn có thể gặp rắc rối là nếu bất kỳ mã nào bạn đang sử dụng sử dụng C ++ không chuẩn. GCC hỗ trợ rất nhiều phần mở rộng cho C ++ mà các trình biên dịch khác sẽ không chấp nhận. Nếu bạn sử dụng bất kỳ thứ nào trong số này, clang có thể từ chối biên dịch mã của bạn. GCC phải hỗ trợ biên dịch rất nhiều mã cũ và (theo tôi hiểu) thì nhẹ nhàng hơn ở một số điểm so với Clang.


2

Tôi đang sử dụng cả trong công việc, gcc và clang. Tất nhiên, bạn sẽ nhận được nhiều cảnh báo hơn với cả hai trình biên dịch, và điều này thật tuyệt. Mặt khác, các cảnh báo có thể mâu thuẫn với nhau.

Trường hợp khó chịu nhất mà tôi tìm thấy, là khi clang phát hiện ra một defaultquy tắc switchvà nói rằng tất cả các giá trị đã được bảo hiểm và gcc khăng khăng đòi có defaulttrường hợp (tài liệu ở đây ). Nhưng bạn sẽ chỉ thấy mâu thuẫn này khi bạn thiết lập các cảnh báo rất nghiêm ngặt trên cả hai trình biên dịch.

Theo chủ quan, tôi sẽ nói rằng clang đã có những cảnh báo chặt chẽ hơn và bạn thậm chí có thể nhận được nhiều hơn trong số chúng nếu bạn sử dụng -Weverythinghoặc thậm chí là máy phân tích clang (máy phân tích mã tĩnh). Nhưng tôi cũng đã có những cảnh báo rằng gcc đã phát hiện ra và cũng rất quan trọng.

Hầu hết các trình biên dịch chuyển đổi có chính xác cùng tên. Tên của các công tắc cảnh báo khác nhau. Điều này có thể gây phiền nhiễu nếu bạn quyết định sử dụng -Wno-*các tùy chọn để tắt cảnh báo. Bạn sẽ không thể tránh việc biên dịch có điều kiện trong make / cmake, theo như tôi có thể thấy, nhưng không khó để giải quyết điều này.

Tôi sẽ tránh định dạng mã với các công cụ tự động. Thật khó chịu vì nó làm ô nhiễm đầu ra đổ lỗi. Và sau đó sáp nhập dài hạn có thể trở nên rất khó khăn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.