I found out how file_has_acl is meant to be called by looking at the coreutils source code.
2011-10-03 Bruno Haible <br...@clisp.org> acl: Fix specification. * lib/file-has-acl.c (file_has_acl): Fix specification. --- lib/file-has-acl.c.orig Mon Oct 3 15:47:44 2011 +++ lib/file-has-acl.c Mon Oct 3 15:47:12 2011 @@ -439,7 +439,8 @@ /* Return 1 if NAME has a nontrivial access control list, 0 if NAME only has no or a base access control list, and -1 (setting errno) - on error. SB must be set to the stat buffer of FILE. */ + on error. SB must be set to the stat buffer of NAME, obtained + through stat() or lstat(). */ int file_has_acl (char const *name, struct stat const *sb)