diff --git a/source/opt/scalar_replacement_pass.h b/source/opt/scalar_replacement_pass.h index 7fb8915fb..3d1377bf7 100644 --- a/source/opt/scalar_replacement_pass.h +++ b/source/opt/scalar_replacement_pass.h @@ -15,6 +15,7 @@ #ifndef SOURCE_OPT_SCALAR_REPLACEMENT_PASS_H_ #define SOURCE_OPT_SCALAR_REPLACEMENT_PASS_H_ +#include #include #include #include @@ -37,11 +38,10 @@ class ScalarReplacementPass : public MemPass { public: ScalarReplacementPass(uint32_t limit = kDefaultLimit) : max_num_elements_(limit) { - name_[0] = '\0'; - strcat(name_, "scalar-replacement="); - const size_t name_len = strlen(name_); - snprintf(&name_[name_len], sizeof(name_) - name_len, "%d", - max_num_elements_); + const auto num_to_write = snprintf( + name_, sizeof(name_), "scalar-replacement=%u", max_num_elements_); + assert(size_t(num_to_write) < sizeof(name_)); + (void)num_to_write; // Mark as unused } const char* name() const override { return name_; } @@ -255,7 +255,10 @@ class ScalarReplacementPass : public MemPass { // Limit on the number of members in an object that will be replaced. // 0 means there is no limit. uint32_t max_num_elements_; - char name_[55]; + // This has to be big enough to fit "scalar-replacement=" followed by a + // uint32_t number written in decimal (so 10 digits), and then a + // terminating nul. + char name_[30]; }; } // namespace opt diff --git a/test/opt/scalar_replacement_test.cpp b/test/opt/scalar_replacement_test.cpp index 7db997d4a..0c97c80b7 100644 --- a/test/opt/scalar_replacement_test.cpp +++ b/test/opt/scalar_replacement_test.cpp @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "source/opt/scalar_replacement_pass.h" + #include #include "gmock/gmock.h" @@ -23,6 +25,18 @@ namespace spvtools { namespace opt { namespace { +using ScalarReplacementPassName = ::testing::Test; + +TEST_F(ScalarReplacementPassName, Default) { + auto srp = ScalarReplacementPass(); + EXPECT_STREQ(srp.name(), "scalar-replacement=100"); +} + +TEST_F(ScalarReplacementPassName, Large) { + auto srp = ScalarReplacementPass(0xffffffffu); + EXPECT_STREQ(srp.name(), "scalar-replacement=4294967295"); +} + using ScalarReplacementTest = PassTest<::testing::Test>; TEST_F(ScalarReplacementTest, SimpleStruct) {