diff --git a/foundry.toml b/foundry.toml index bcfe0c08a..e502cbe48 100644 --- a/foundry.toml +++ b/foundry.toml @@ -15,6 +15,8 @@ fs_permissions = [{ access = "read", path = "./test/data"}] remappings = [ "forge-std=test/utils/forge-std/" ] +# remove memory-safe-assembly warning from compiler +ignored_error_codes = [2424,8429,4591] [profile.pre_global_structs] skip = ["*/g/*", "*/*7702*", "*/*BlockHashLib*", "*/*Transient*", "*/ext/ithaca/*", "*/ext/zksync/*"] @@ -46,6 +48,9 @@ remappings = [ "forge-std=test/utils/forge-std/" ] +[lint] +lint_on_build = false + [fmt] line_length = 100 # While we allow up to 120, we lint at 100 for readability. ignore = ["src/accounts/EIP7702Proxy.sol"] diff --git a/src/utils/LibString.sol b/src/utils/LibString.sol index 708004f41..d84bacc68 100644 --- a/src/utils/LibString.sol +++ b/src/utils/LibString.sol @@ -926,7 +926,7 @@ library LibString { result := mul( or( // Load the length and the bytes of `a` and `b`. shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), - mload(sub(add(b, 0x1e), aLen)) + shr(shl(3, add(aLen, 1)), mload(add(b, 0x1f))) ), // `totalLen != 0 && totalLen < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. diff --git a/src/utils/g/LibString.sol b/src/utils/g/LibString.sol index b20eabf13..f7d03047e 100644 --- a/src/utils/g/LibString.sol +++ b/src/utils/g/LibString.sol @@ -930,7 +930,7 @@ library LibString { result := mul( or( // Load the length and the bytes of `a` and `b`. shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), - mload(sub(add(b, 0x1e), aLen)) + shr(shl(3, add(aLen, 1)), mload(add(b, 0x1f))) ), // `totalLen != 0 && totalLen < 31`. Abuses underflow. // Assumes that the lengths are valid and within the block gas limit. diff --git a/test/LibString.t.sol b/test/LibString.t.sol index 9b90f9973..fac778ea2 100644 --- a/test/LibString.t.sol +++ b/test/LibString.t.sol @@ -1456,6 +1456,14 @@ contract LibStringTest is SoladyTest { testStringPackAndUnpackTwo("abcdefghijklmnopqrstuvwxyzABCD", ""); testStringPackAndUnpackTwo("The strongest community I've ever seen", "NGL"); testStringPackAndUnpackTwo("", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); + testStringPackAndUnpackTwo( + "01234567890123456789012345678901_search_search_search_search_search_search_23456789012345678901234567890123456789_search_search_search_search_search_search", + "" + ); + testStringPackAndUnpackTwoDifferential( + "01234567890123456789012345678901_search_search_search_search_search_search_23456789012345678901234567890123456789_search_search_search_search_search_search", + "" + ); } }