Từ một BSTR
chỉ là một typedef
cho wchar_t*
cơ sở mã của chúng tôi có một số (nhiều?) Nơi literals chuỗi được truyền đến một phương pháp mong đợi một BSTR
lon này mess lên với marshallers hoặc bất kỳ ai cố gắng sử dụng bất kỳ phương thức cụ thể nào (ví dụ: SysStringLen
) BSTR
.tĩnh phân tích mã để phát hiện thông qua một wchar_t * để BSTR
Có cách nào để phát hiện tĩnh loại lạm dụng này không?
tôi đã cố gắng biên soạn với VC10 /Wall
và với tĩnh phân tích mã Microsoft Tất cả quy tắc nhưng mảnh vi phạm mã sau đây không được đánh dấu bởi một trong hai trong số họ.
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
Cập nhật: Sau khi cố gắng phá hoại wtypes.h
vào việc phát hiện các loại tội lỗi tôi đã từ bỏ.
Tôi đã thử hai đường dẫn, cả hai đều phải làm việc với chương trình mẫu của mình ở trên nhưng một khi tôi đã thử một dự án thực sự thì chúng không thành công.
- tạo ra một lớp tên là
BSTR
nhưng vì mộtVARIANT
cóBSTR
như một thành viên công đoàn các lớp mới không thể có bất kỳ nhà thầu hoặc nhà khai thác nhiệm vụ này đã phá vỡ mọi nơi đượcNULL
được đối xử như mộtBSTR
. Tôi đã cố gắng thay thếNULL
bằng một loại có toán tử chuyển đổi nhưng sau khi thêm hàng tá toán tử mới (so sánh, chuyển đổi, v.v.) tôi bắt đầu chạy vào các cuộc gọi mơ hồ và bỏ cuộc. - Sau đó, tôi đã thử cách được đề xuất bởi @CashCow và @Hans (tạo
BSTR
atypedef
cho một loại con trỏ khác). Điều đó không có tác dụng, sau khi thêmtoBSTR
vàfromBSTR
phương pháp và xả rác comutil.h (_bstr_t
) và các địa điểm khác có chuyển đổi cuối cùng tôi đã đến lúc trình biên dịch bị nghẹn ở tiêu đề được tạo từ IDL (giá trị mặc định được dịch sang chữ) chuỗi rộng).
Tóm lại tôi đã từ bỏ việc tự mình thực hiện điều này, nếu có ai biết về công cụ phân tích mã có thể giúp tôi rất vui khi được nghe về nó.
BSTR có thể là một typedef nhưng điều đó không có nghĩa là đó là chuỗi bị hủy. Chuỗi đại diện của nó thực sự là sinh vật với ký tự wchar_t thứ 3, 2 đầu tiên là tiền tố chiều dài (do đó cho phép độ dài tối đa 0xFFFF). Chúng có thể chứa các giá trị rỗng được nhúng. Tôi nghĩ rằng họ thường là null chấm dứt. – CashCow
@CashCow, không chính xác, độ dài được đặt * trước * dữ liệu thực tế (đây là những gì 'SysStringLen' tìm) là lý do tại sao nó không chính xác để xử lý' wchar_t * 'là' BSTR'. – Motti
Có, độ dài trước dữ liệu. Khi bạn gọi SysAllocString nó trả về cho bạn byte thứ 5. Khi bạn vượt qua trong một BSTR bạn vượt qua trong địa chỉ của byte được phân bổ thứ 5. – CashCow