diff --git a/src/lib/swim/swim.c b/src/lib/swim/swim.c
index a9a0a39b304205c38543de44969160ef07b048b7..fb2b1490b4c7761c8985cc5e3c7a0c9fd952d59e 100644
--- a/src/lib/swim/swim.c
+++ b/src/lib/swim/swim.c
@@ -1890,6 +1890,10 @@ int
 swim_probe_member(struct swim *swim, const char *uri)
 {
 	assert(swim_is_configured(swim));
+	if (uri == NULL) {
+		diag_set(SwimError, "swim.probe_member: URI is mandatory");
+		return -1;
+	}
 	struct sockaddr_in addr;
 	if (swim_uri_to_addr(uri, &addr, "swim.probe_member:") != 0)
 		return -1;
diff --git a/test/unit/swim.c b/test/unit/swim.c
index d9613e8e01385ebb4f2315b688cc73ebabb203b5..c6ef1eebc0a67976adcb396cd1cd9224f7f71278 100644
--- a/test/unit/swim.c
+++ b/test/unit/swim.c
@@ -359,12 +359,13 @@ swim_test_basic_gossip(void)
 static void
 swim_test_probe(void)
 {
-	swim_start_test(2);
+	swim_start_test(3);
 	struct swim_cluster *cluster = swim_cluster_new(2);
 
 	struct swim *s1 = swim_cluster_member(cluster, 0);
 	struct swim *s2 = swim_cluster_member(cluster, 1);
 	const char *s2_uri = swim_member_uri(swim_self(s2));
+	is(swim_probe_member(s1, NULL), -1, "probe validates URI");
 	is(swim_probe_member(s1, s2_uri), 0, "send probe");
 	is(swim_cluster_wait_fullmesh(cluster, 0.1), 0,
 	   "receive ACK on probe and get fullmesh")
diff --git a/test/unit/swim.result b/test/unit/swim.result
index 266d8358980be5a9f7e40a5b26958c3dfedc37d1..587f66c7a976ba11a03220fbe1acd23f4b2312ee 100644
--- a/test/unit/swim.result
+++ b/test/unit/swim.result
@@ -78,9 +78,10 @@ ok 5 - subtests
 ok 6 - subtests
 	*** swim_test_basic_failure_detection: done ***
 	*** swim_test_probe ***
-    1..2
-    ok 1 - send probe
-    ok 2 - receive ACK on probe and get fullmesh
+    1..3
+    ok 1 - probe validates URI
+    ok 2 - send probe
+    ok 3 - receive ACK on probe and get fullmesh
 ok 7 - subtests
 	*** swim_test_probe: done ***
 	*** swim_test_refute ***