Skip to content

Commit f11b7e7

Browse files
authored
add an option to not fuzz memory (#1915)
1 parent 3564b71 commit f11b7e7

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/tools/fuzzing.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,14 @@ class TranslateToFuzzReader {
131131
allowNaNs = allowNaNs_;
132132
}
133133

134+
void setAllowMemory(bool allowMemory_) {
135+
allowMemory = allowMemory_;
136+
}
137+
134138
void build() {
135-
setupMemory();
139+
if (allowMemory) {
140+
setupMemory();
141+
}
136142
setupTable();
137143
setupGlobals();
138144
addImportLoggingSupport();
@@ -187,6 +193,9 @@ class TranslateToFuzzReader {
187193
// TODO: de-NaN SIMD values
188194
bool allowNaNs = true;
189195

196+
// Whether to emit memory operations like loads and stores.
197+
bool allowMemory = true;
198+
190199
// Features allowed to be emitted
191200
FeatureSet features = FeatureSet::All;
192201

@@ -1137,6 +1146,7 @@ class TranslateToFuzzReader {
11371146
}
11381147

11391148
Expression* makeLoad(Type type) {
1149+
if (!allowMemory) return makeTrivial(type);
11401150
auto* ret = makeNonAtomicLoad(type);
11411151
if (type != i32 && type != i64) return ret;
11421152
if (!features.hasAtomics() || oneIn(2)) return ret;
@@ -1208,6 +1218,7 @@ class TranslateToFuzzReader {
12081218
}
12091219

12101220
Expression* makeStore(Type type) {
1221+
if (!allowMemory) return makeTrivial(type);
12111222
auto* ret = makeNonAtomicStore(type);
12121223
auto* store = ret->dynCast<Store>();
12131224
if (!store) return ret;
@@ -1595,6 +1606,7 @@ class TranslateToFuzzReader {
15951606

15961607
Expression* makeAtomic(Type type) {
15971608
assert(features.hasAtomics());
1609+
if (!allowMemory) return makeTrivial(type);
15981610
wasm.memory.shared = true;
15991611
if (type == i32 && oneIn(2)) {
16001612
if (ATOMIC_WAITS && oneIn(2)) {
@@ -1732,6 +1744,7 @@ class TranslateToFuzzReader {
17321744
}
17331745

17341746
Expression* makeBulkMemory(Type type) {
1747+
if (!allowMemory) return makeTrivial(type);
17351748
assert(features.hasBulkMemory());
17361749
assert(type == none);
17371750
switch (upTo(4)) {
@@ -1744,6 +1757,7 @@ class TranslateToFuzzReader {
17441757
}
17451758

17461759
Expression* makeMemoryInit() {
1760+
if (!allowMemory) return makeTrivial(none);
17471761
auto segment = uint32_t(get32());
17481762
Expression* dest = make(i32);
17491763
Expression* offset = make(i32);
@@ -1752,17 +1766,20 @@ class TranslateToFuzzReader {
17521766
}
17531767

17541768
Expression* makeDataDrop() {
1769+
if (!allowMemory) return makeTrivial(none);
17551770
return builder.makeDataDrop(get32());
17561771
}
17571772

17581773
Expression* makeMemoryCopy() {
1774+
if (!allowMemory) return makeTrivial(none);
17591775
Expression* dest = make(i32);
17601776
Expression* source = make(i32);
17611777
Expression* size = make(i32);
17621778
return builder.makeMemoryCopy(dest, source, size);
17631779
}
17641780

17651781
Expression* makeMemoryFill() {
1782+
if (!allowMemory) return makeTrivial(none);
17661783
Expression* dest = make(i32);
17671784
Expression* value = make(i32);
17681785
Expression* size = make(i32);

src/tools/wasm-opt.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ int main(int argc, const char* argv[]) {
7272
bool translateToFuzz = false;
7373
bool fuzzPasses = false;
7474
bool fuzzNaNs = true;
75+
bool fuzzMemory = true;
7576
std::string emitJSWrapper;
7677
std::string emitSpecWrapper;
7778
std::string inputSourceMapFilename;
@@ -116,6 +117,9 @@ int main(int argc, const char* argv[]) {
116117
.add("--no-fuzz-nans", "", "don't emit NaNs when fuzzing, and remove them at runtime as well (helps avoid nondeterminism between VMs)",
117118
Options::Arguments::Zero,
118119
[&](Options *o, const std::string& arguments) { fuzzNaNs = false; })
120+
.add("--no-fuzz-memory", "", "don't emit memory ops when fuzzing",
121+
Options::Arguments::Zero,
122+
[&](Options *o, const std::string& arguments) { fuzzMemory = false; })
119123
.add("--emit-js-wrapper", "-ejw", "Emit a JavaScript wrapper file that can run the wasm with some test values, useful for fuzzing",
120124
Options::Arguments::One,
121125
[&](Options *o, const std::string& arguments) { emitJSWrapper = arguments; })
@@ -172,6 +176,7 @@ int main(int argc, const char* argv[]) {
172176
}
173177
reader.setFeatures(options.getFeatures());
174178
reader.setAllowNaNs(fuzzNaNs);
179+
reader.setAllowMemory(fuzzMemory);
175180
reader.build();
176181
if (options.passOptions.validate) {
177182
if (!WasmValidator().validate(wasm, options.getFeatures())) {

0 commit comments

Comments
 (0)