Skip to content

Commit 3236b5d

Browse files
committed
Add explicit rule for sockaddr
1 parent 3fee272 commit 3236b5d

5 files changed

Lines changed: 20 additions & 13 deletions

File tree

cpp2rust/cpp_rule_preprocessor.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,14 +109,15 @@ class Callback : public clang::ast_matchers::MatchFinder::MatchCallback {
109109
}
110110
return;
111111
}
112-
if (auto var = R.Nodes.getNodeAs<clang::TypeAliasDecl>("tvar")) {
113-
clang::QualType type;
114-
if (auto *tdecl = var->getDescribedAliasTemplate()) {
115-
type = lookupType(tdecl);
116-
} else {
117-
type = var->getUnderlyingType();
112+
if (auto var = R.Nodes.getNodeAs<clang::TypedefNameDecl>("tvar")) {
113+
clang::QualType type = var->getUnderlyingType();
114+
if (auto *alias = llvm::dyn_cast<clang::TypeAliasDecl>(var)) {
115+
if (auto *tdecl = alias->getDescribedAliasTemplate()) {
116+
type = lookupType(tdecl);
117+
}
118118
}
119-
out_.try_emplace(var->getQualifiedNameAsString(), Mapper::ToString(type));
119+
auto src = Mapper::ToString(type, Mapper::ScalarSugar::kPreserve);
120+
out_.try_emplace(var->getQualifiedNameAsString(), std::move(src));
120121
return;
121122
}
122123

@@ -707,7 +708,7 @@ class ActionFactory : public clang::tooling::FrontendActionFactory {
707708
&cb_);
708709

709710
finder_.addMatcher(
710-
typeAliasDecl(matchesName("(^|::)t[0-9]+$"), isExpansionInMainFile())
711+
typedefNameDecl(matchesName("(^|::)t[0-9]+$"), isExpansionInMainFile())
711712
.bind("tvar"),
712713
&cb_);
713714

rules/socket/src.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include <sys/types.h>
33
#include <sys/socket.h>
44

5+
typedef struct sockaddr t1;
6+
57
int f1() {
68
return MSG_NOSIGNAL;
79
}

rules/socket/tgt_unsafe.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
fn t1() -> libc::sockaddr {
2+
unsafe { std::mem::zeroed() }
3+
}
4+
15
unsafe fn f1() -> i32 {
26
libc::MSG_NOSIGNAL
37
}

tests/unit/out/unsafe/libc_struct_without_default.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ impl Default for UserDefined {
2323
#[repr(C)]
2424
#[derive(Copy, Clone)]
2525
pub struct FieldIsLibcType {
26-
pub addr: sockaddr,
26+
pub addr: libc::sockaddr,
2727
}
2828
impl Default for FieldIsLibcType {
2929
fn default() -> Self {
3030
FieldIsLibcType {
31-
addr: unsafe { std::mem::zeroed::<sockaddr>() },
31+
addr: unsafe { std::mem::zeroed() },
3232
}
3333
}
3434
}
@@ -59,7 +59,7 @@ unsafe fn main_0() -> i32 {
5959
st.st_size = 1024_i64;
6060
assert!(((st.st_size) == (1024_i64)));
6161
let mut ud: UserDefined = <UserDefined>::default();
62-
assert!(((ud.a[(0_usize)]) == (0)));
62+
assert!(((ud.a[(0_usize) as usize]) == (0)));
6363
assert!(((ud.v.len()) == (0_usize)));
6464
let mut filt: FieldIsLibcType = <FieldIsLibcType>::default();
6565
assert!(((filt.addr.sa_family as i32) == (0)));

tests/unit/out/unsafe/socket_transparent_union.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ unsafe fn main_0() -> i32 {
1818
assert!(
1919
((((libc::getsockname(
2020
fd,
21-
((&mut ssloc as *mut sockaddr_storage) as *mut sockaddr),
21+
((&mut ssloc as *mut sockaddr_storage) as *mut libc::sockaddr),
2222
(&mut slen as *mut u32)
2323
)) == (-1_i32)) as i32)
2424
!= 0)
@@ -28,7 +28,7 @@ unsafe fn main_0() -> i32 {
2828
assert!(
2929
((((libc::getsockname(
3030
fd,
31-
((&mut sin as *mut sockaddr_in) as *mut sockaddr),
31+
((&mut sin as *mut sockaddr_in) as *mut libc::sockaddr),
3232
(&mut inlen as *mut u32)
3333
)) == (-1_i32)) as i32)
3434
!= 0)

0 commit comments

Comments
 (0)