This is not true in general. It depends on how you are coding the buffer mutations. Doing operations in IO does not remove any type safety. If you are treating blocks of memory as arrays of untyped values, then you are removing type safety, but there is no reason to believe that the author is doing this.
Personally, I have found C libraries a lot easier to use from Haskell. A few "newtype" and Storabe instances later, you get a library that is impossible to make crash. You write the rest of your program in terms of that (in pure Haskell), and you are pretty much guaranteed enough safety to not segfault.
(I've specifically worked with a third-party financial analytics library that is quite crashy if you call certain functions in certain order. I used the type system to prevent myself from doing that, and now I can write complex problems that don't crash. Great success.)
Personally, I have found C libraries a lot easier to use from Haskell. A few "newtype" and Storabe instances later, you get a library that is impossible to make crash. You write the rest of your program in terms of that (in pure Haskell), and you are pretty much guaranteed enough safety to not segfault.
(I've specifically worked with a third-party financial analytics library that is quite crashy if you call certain functions in certain order. I used the type system to prevent myself from doing that, and now I can write complex problems that don't crash. Great success.)